diff --git a/activity_3/img/earth.png b/activity_3/img/earth.png
new file mode 100644
index 0000000000000000000000000000000000000000..381e7ed287898ba7f2ca5a16ae17bcbcb06d5ad7
Binary files /dev/null and b/activity_3/img/earth.png differ
diff --git a/activity_3/img/landerjpg.jpg b/activity_3/img/landerjpg.jpg
deleted file mode 100644
index 749004cfa2474cf9f31149d77996c71072e363a7..0000000000000000000000000000000000000000
Binary files a/activity_3/img/landerjpg.jpg and /dev/null differ
diff --git a/activity_3/img/r1.png b/activity_3/img/r1.png
deleted file mode 100644
index d6f643aaea9ef5fd99dbd2fd5a212a0826a7438d..0000000000000000000000000000000000000000
Binary files a/activity_3/img/r1.png and /dev/null differ
diff --git a/activity_3/img/r2.png b/activity_3/img/r2.png
deleted file mode 100644
index 96f53395f0f5055054b61504e6655c8414e858ea..0000000000000000000000000000000000000000
Binary files a/activity_3/img/r2.png and /dev/null differ
diff --git a/activity_3/img/r3.png b/activity_3/img/r3.png
deleted file mode 100644
index 04a923e2474a4ca31ed5e045fae9f226facd517d..0000000000000000000000000000000000000000
Binary files a/activity_3/img/r3.png and /dev/null differ
diff --git a/activity_3/img/r4.png b/activity_3/img/r4.png
deleted file mode 100644
index 9b30cc4ffe72c6e8c400e928d294b18db6ed3966..0000000000000000000000000000000000000000
Binary files a/activity_3/img/r4.png and /dev/null differ
diff --git a/activity_3/index.html b/activity_3/index.html
index 486b94786bbcf7bd45a775dfe6b280c44e18ad3e..0ba263290afcf4862b0999086ad471d4ca1b1424 100644
--- a/activity_3/index.html
+++ b/activity_3/index.html
@@ -28,11 +28,11 @@
 		<div id="intro_modal" class="modal">
 		  <div class="modal-content">
 		    <span class="close">&times;</span>
-				<h1 style="text-align: center;">Bienvenue dans la mission 2 !</h1>
-				<p>Le carburant est chargé dans la fusée, les astronautes sont à bord et tous les voyants sont au vert... C'est l'heure du décollage !</p>
-				<p>Il faut mettre la fusée sur orbite. Pour cela, on contrôle la puissance des moteurs de la fusée. Plus ils fonctionnent de façon puissante, plus ils consomment de carburants. Heureusement, une fusée est constituée de plusieurs étages, dès qu'un étage est vide, on peut le larguer et continuer avec le carburant de celui d'après. </p>
-				<p>Attention également, dans la zone dite de "Max Q" (pression dynamique maximale), si la fusée va trop vite, elle risque d'exploser. Pensez à réduire la puissance des moteurs dans cette zone donc !</p>
-				<p style="text-align: center;"><strong>A vous de jouer ! Bon vol !</strong></p>
+				<h1 style="text-align: center;">Bienvenue dans la mission 3 !</h1>
+				<p>Le module lunaire entame sa descente vers la surface de la lune, le grand moment est arrivé !</p>
+				<p>Il faut contrôler la puissance des moteurs de la fusée afin d'alunire à une vitesse suffisament faible pour ne pas endommager la fusée. </p>
+				<p>Attention, vos réserves de carburant sont limités et il faut réussir l'objectif en dépensant le minimum de carburant !</p>
+				<p style="text-align: center;"><strong>A vous de jouer ! Alunissez bien !</strong></p>
 		  </div>
 		</div>
 		<header id="header"></header>
diff --git a/activity_3/main-script.js b/activity_3/main-script.js
index 911c24de36b71134cbfe1625a5ecc21e7b30ee43..74a2f04a7c1f298d638ab13536e3a2f2355e83e3 100644
--- a/activity_3/main-script.js
+++ b/activity_3/main-script.js
@@ -22,26 +22,21 @@ window.onclick = function(event) {
   }
 }
 
-
-
+runButton.style.background = 'linear-gradient(to bottom, #77B55B 5%, #568241 100%)';
+runButton.style.border = '3px solid #476B36';
+connectButton.style.background = 'linear-gradient(to bottom, #737375 5%, #5D5C5E 100%)';
+connectButton.style.border = '3px solid #353436';
 
 
 var firstTime;
 var curSpeed;
 var curPos;
-var curStage;
 var fuel_ratio;
 var power_ratio;
-var rocketLaunched;
 var simu_timeouts = [];
-var manual_enabled;
 
 var sky_rect
-var maxq_rect
-var maxq_text
-var path
-var rocket
-var length
+
 
 var fuel_rect
 var fuel_box
@@ -51,58 +46,53 @@ var power_rect
 var power_box
 var power_text
 
-var rocket_img
-
-
-
-
-
-var canvas = SVG().addTo('#animationArea').size(660, 510)
-
-var fuel_gradient = canvas.gradient('linear', function(add) {
-  add.stop(0, '#ff2e27')
-  add.stop(1, '#ffde00')
-})
-var power_gradient = canvas.gradient('linear', function(add) {
-  add.stop(0, '#3c8001')
-  add.stop(1, '#93f45e')
-})
-var sky_gradient = canvas.gradient('linear', function(add) {
-  add.stop(0, '#4cdaff')
-  add.stop(1, '#001b91')
-}).from(0, 1).to(0, 0)
-sky_rect = canvas.rect(500, 350).fill(sky_gradient).stroke({ width: 3, color: '#333' }).attr({x: 5, y: 5})
-maxq_rect = canvas.rect(500, 30).stroke({ width: 3, color: '#555' }).attr({x: 5, y: 220, fill:'#FFA343', })
-maxq_text = canvas.text("Zone de max Q").attr({x: 350, y:220})
-path = canvas.path("M40,353 C40,70 300,48 503,41").fill('none').stroke({width:5, color: '#ff0000'})
-rocket = canvas.image('img/r1.png').size(30, 1000).center(40,353)
-length = path.length()
-
-fuel_rect = canvas.rect(490, 50).attr({x: 160, y: 450, fill: fuel_gradient})
-fuel_box = canvas.rect(490, 50).fill('none').stroke({ width: 3, color: '#333' }).attr({x: 160, y: 450})
-fuel_text = canvas.text("Carburant de l'étage :").attr({x: 0, y: 460})
-
-power_rect = canvas.rect(490, 50).attr({x: 160, y: 395, fill: power_gradient})
-power_box = canvas.rect(490, 50).fill('none').stroke({ width: 3, color: '#333' }).attr({x: 160, y: 395})
-power_text = canvas.text("Puissance moteurs :").attr({x: 0, y: 405})
-
-rocket_img = canvas.image('img/r1.png').attr({x: 550, y : 0})
-
-function enableManual() {
-  manual_enabled = true;
-  document.addEventListener('keydown', function(event) {
-      if(event.keyCode == 38) {
-          changePower(power_ratio+0.01)
-      }
-      else if(event.keyCode == 40) {
-          changePower(power_ratio-0.01)
-      } else if (event.keyCode == 32) {
-        if (rocketLaunched) changeRocketStage()
-        else launchRocket()
-      }
-  });
+var speed_label_text
+var speed_text
+var speed_unit_text
+
+var lander_img
+var earth_img
+
+var fuel_gradient
+var power_gradient
+var sky_gradient
+
+
+var canvas = SVG().addTo('#animationArea').size(660, 490)
+
+function init_canvas() {
+  fuel_gradient = canvas.gradient('linear', function(add) {
+    add.stop(0, '#ff2e27')
+    add.stop(1, '#ffde00')
+  })
+  power_gradient = canvas.gradient('linear', function(add) {
+    add.stop(0, '#3c8001')
+    add.stop(1, '#93f45e')
+  })
+  sky_gradient = canvas.gradient('linear', function(add) {
+    add.stop(0, '#000D47')
+    add.stop(1, '#00051C')
+  }).from(0, 1).to(0, 0)
+  sky_rect = canvas.rect(650, 350).fill(sky_gradient).stroke({ width: 3, color: '#333' }).attr({x: 5, y: 5})
+  
+  fuel_rect = canvas.rect(490, 50).attr({x: 160, y: 435, fill: fuel_gradient})
+  fuel_box = canvas.rect(490, 50).fill('none').stroke({ width: 3, color: '#333' }).attr({x: 160, y: 435})
+  fuel_text = canvas.text("Carburant du module :").attr({x: 0, y: 445})
+  
+  power_rect = canvas.rect(490, 50).attr({x: 160, y: 370, fill: power_gradient})
+  power_box = canvas.rect(490, 50).fill('none').stroke({ width: 3, color: '#333' }).attr({x: 160, y: 370})
+  power_text = canvas.text("Puissance moteurs :").attr({x: 0, y: 380})
+  
+  speed_label_text = canvas.text("Vitesse :").attr({x:505, y : 110}).font({fill : "#FFFFFF", weight: "bold", size : "25px"})
+  speed_text = canvas.text("00.00").attr({x:510, y : 130}).font({fill : "#FFFFFF", weight: "bold", size : "40px"})
+  speed_unit_text = canvas.text("km/h").attr({x:535, y : 180}).font({fill : "#FFFFFF", size : "20px"})
+
+  lander_img = canvas.image('img/lander.png').size(30, 30).attr({x: 325, y : 0})
+
+  earth_img = canvas.image('img/earth.png').size(90, 90).attr({x: 100, y : 50})
 }
 
+init_canvas()
 
 
 function init_var() {
@@ -111,57 +101,25 @@ function init_var() {
   }
   console.log("Initialisation de la simulation")
   firstTime = (new Date()).getTime()
-  manual_enabled = false;
-  curPos = 0;
-  curSpeed = 0;
-  curStage = 1;
-  rocketLaunched = false;
+  curPos = 1;
+  curSpeed = -0.03;
   canvas.clear()
-  var fuel_gradient = canvas.gradient('linear', function(add) {
-    add.stop(0, '#ff2e27')
-    add.stop(1, '#ffde00')
-  })
-  var power_gradient = canvas.gradient('linear', function(add) {
-    add.stop(0, '#3c8001')
-    add.stop(1, '#93f45e')
-  })
-  var sky_gradient = canvas.gradient('linear', function(add) {
-    add.stop(0, '#4cdaff')
-    add.stop(1, '#001b91')
-  }).from(0, 1).to(0, 0)
-  sky_rect = canvas.rect(500, 350).fill(sky_gradient).stroke({ width: 3, color: '#333' }).attr({x: 5, y: 5})
-  maxq_rect = canvas.rect(500, 30).stroke({ width: 3, color: '#555' }).attr({x: 5, y: 220, fill:'#FFA343', })
-  maxq_text = canvas.text("Zone de max Q").attr({x: 350, y:220})
-  path = canvas.path("M40,353 C40,70 300,48 503,41").fill('none').stroke({width:5, color: '#ff0000'})
-  rocket = canvas.image('img/r1.png').size(30, 1000).center(40,353)
-  length = path.length()
-
-  fuel_rect = canvas.rect(490, 50).attr({x: 160, y: 450, fill: fuel_gradient})
-  fuel_box = canvas.rect(490, 50).fill('none').stroke({ width: 3, color: '#333' }).attr({x: 160, y: 450})
-  fuel_text = canvas.text("Carburant de l'étage :").attr({x: 0, y: 460})
-
-  power_rect = canvas.rect(490, 50).attr({x: 160, y: 395, fill: power_gradient})
-  power_box = canvas.rect(490, 50).fill('none').stroke({ width: 3, color: '#333' }).attr({x: 160, y: 395})
-  power_text = canvas.text("Puissance moteurs :").attr({x: 0, y: 405})
-
-  rocket_img = canvas.image('img/r1.png').attr({x: 550, y : 0})
-  changeFuel(1, 0)
+  init_canvas()
   changePower(0, 0)
+  changeFuel(1, 0)
   stepSimulation(getCurTime())
 }
 
-function launchRocket() {
-  rocketLaunched = true;
-}
 
 function getCurTime() {
   return(new Date()).getTime() - firstTime;
 }
 
 function update_speed(deltaT) {
-  if (curPos <= 0 && curSpeed < 0 && power_ratio<=0.5) curSpeed = 0
-  else if (!rocketLaunched) curSpeed = 0
-  else curSpeed = curSpeed + (power_ratio-0.5)*deltaT*0.01
+  if (curPos <= 0 && curSpeed < 0 && power_ratio<=0.2) curSpeed = 0
+  else curSpeed = curSpeed + (power_ratio-0.2)*deltaT*0.04
+  var disp_speed = Math.round((-(curSpeed*200) + Number.EPSILON) * 100) / 100
+  speed_text.text(""+ disp_speed)
 
 }
 
@@ -171,7 +129,7 @@ function update_pos(deltaT) {
 }
 
 function update_fuel(deltaT) {
-  changeFuel(fuel_ratio - power_ratio*deltaT*0.12, 0)
+  changeFuel(fuel_ratio - power_ratio*deltaT*0.10, 0)
   if (fuel_ratio <= 0) {
     changePower(0, 200)
   }
@@ -181,9 +139,7 @@ function isFuelEmpty() {
   return fuel_ratio <= 0;
 }
 
-function isInMaxQ() {
-  return curPos>0.14 && curPos<0.23
-}
+
 
 function stepSimulation(prevTime) {
   var t = getCurTime()
@@ -191,21 +147,18 @@ function stepSimulation(prevTime) {
   update_speed(deltaT/1000)
   update_pos(deltaT/1000)
   update_fuel(deltaT/1000)
-  var p = path.pointAt(curPos*length)
-  rocket.center(p.x, p.y)
-  //console.log('pos' + curPos + 'speed' + curSpeed)
-  if (curPos>0.17 && curPos<0.20 && power_ratio > 0.6)  {
-    changeRocketImg('img/explosion.png')
-    alert("Explosion ! Trop de puissance au point max Q !")
-  }
-  else if (curPos >= 1) {
-    if (curStage == 4 || curStage == 3) {
-      alert("Mission réussi ! Le 3e étage est en orbite ! Bravo !")
-      if (!manual_enabled) {
-        alert("Le code de cette mission est 1957")
-      }
+  var height = (1-curPos)*350
+  lander_img.attr({y : height})
+  if (curPos >= 1.05) {
+    alert("Vous allez dans le mauvais sens ! Il faut se poser et non décoller ;)")
+  } else if (curPos <= 0.07) {
+    if (curSpeed <= -0.02) { //4 km/h
+      lander_img.load("img/explosion.png", () => {
+        alert("Vous vous êtes écrasé ! Vous alliez trop vite ! :(")
+      })
+      
     } else {
-      alert("Vous avez atteint la bonne hauteur mais pas avec le bon étage ou sans avoir largué la tour de sauvetage !")
+      alert("Bravo ! Vous avez aluni à la bonne vitesse !")
     }
   } else {
     simu_timeouts.push(setTimeout(function() {stepSimulation(t)}, 40))
@@ -213,6 +166,14 @@ function stepSimulation(prevTime) {
 }
 
 
+function getLanderSpeed() {
+  return -(curSpeed*200)
+}
+
+function isLanderLanded() {
+  return (curPos <= 0.07)
+}
+
 
 
 function changeFuel(ratio, duration) {
@@ -230,15 +191,3 @@ function changePower(ratio, duration) {
   power_rect.animate(duration, 0, 'now').width(power_box.width()*power_ratio);
 }
 
-function changeRocketImg(imgPath) {
- rocket_img.load(imgPath)
- rocket.load(imgPath)
-}
-
-
-
-function changeRocketStage() {
-  curStage = (curStage < 4)?(curStage+1):4;
-  changeRocketImg('img/r' + curStage +'.png')
-  if (curStage < 4) changeFuel(1, 200)
-}
diff --git a/activity_3/toolbox.xml b/activity_3/toolbox.xml
index bf2db3afe636c338a0e1cca72f62386adc506971..151c251daa8f4ecef39f8bcb58c552646ae470ae 100644
--- a/activity_3/toolbox.xml
+++ b/activity_3/toolbox.xml
@@ -1,20 +1,10 @@
 <xml xmlns="https://developers.google.com/blockly/xml" id="toolbox" style="display: none">
-  <category name="Actions" colour="#a5745b">
-    <block type="enable_manual_mode"></block>
-    <block type="launch_rocket"></block>
-    <block type="engine_power_to">
-      <field name="power">50</field>
-    </block>
-    <block type="separate_stage"></block>
-  </category>
-  <category name="Conditions" colour="#5b67a5">
-    <block type="is_fuel_empty"></block>
-    <block type="is_in_max_q"></block>
-  </category>
-  <category name="Boucles" colour="#5ba55b">
-    <block type="controls_whileUntil">
-      <field name="MODE">WHILE</field>
+  <category name="Capteurs/Actionneurs" colour="#a5745b">
+    <block type="set_lander_power_to">
+      <field name="lander_power">0</field>
     </block>
+    <block type="lander_speed"></block>
+    <block type="is_lander_landed"></block>
   </category>
   <category name="Logique" colour="#5b80a5">
     <block type="controls_if"></block>
@@ -24,12 +14,63 @@
     <block type="logic_compare">
       <field name="OP">EQ</field>
     </block>
-    <block type="logic_negate"></block>
     <block type="logic_operation">
       <field name="OP">AND</field>
     </block>
+    <block type="logic_negate"></block>
     <block type="logic_boolean">
       <field name="BOOL">TRUE</field>
     </block>
   </category>
-</xml>
+  <category name="Maths" colour="#5b67a5">
+    <block type="math_number">
+      <field name="NUM">0</field>
+    </block>
+    <block type="math_arithmetic">
+      <field name="OP">ADD</field>
+      <value name="A">
+        <shadow type="math_number">
+          <field name="NUM">1</field>
+        </shadow>
+      </value>
+      <value name="B">
+        <shadow type="math_number">
+          <field name="NUM">1</field>
+        </shadow>
+      </value>
+    </block>
+  </category>
+  <category name="Boucles" colour="#5ba55b">
+    <block type="controls_repeat_ext">
+      <value name="TIMES">
+        <shadow type="math_number">
+          <field name="NUM">10</field>
+        </shadow>
+      </value>
+    </block>
+    <block type="controls_whileUntil">
+      <field name="MODE">WHILE</field>
+    </block>
+    <block type="controls_for">
+      <field name="VAR" id="UTBQR%_ug[@N9ymUL~tP">i</field>
+      <value name="FROM">
+        <shadow type="math_number">
+          <field name="NUM">1</field>
+        </shadow>
+      </value>
+      <value name="TO">
+        <shadow type="math_number">
+          <field name="NUM">10</field>
+        </shadow>
+      </value>
+      <value name="BY">
+        <shadow type="math_number">
+          <field name="NUM">1</field>
+        </shadow>
+      </value>
+    </block>
+    <block type="controls_flow_statements">
+      <field name="FLOW">BREAK</field>
+    </block>
+  </category>
+</xml>
\ No newline at end of file
diff --git a/index.html b/index.html
index 70ac75d3816a436eaa8a1750c9cc9b2879ab4a89..ca9835383ea9d6cd4817a29abfa67fb5db178822 100644
--- a/index.html
+++ b/index.html
@@ -43,7 +43,7 @@
             <a href="activity_3/">
               <h2>Activité 3</h2>
               <img src="res/img/activities_icons/3.png">
-              <p>La fusée arrive en orbite lunaire, il faut désormais se poser à la surface de la Lune. Gérez la séparation du module de service et du lander et contrôlez la descente des deux astronautes.
+              <p>La fusée est dans sa dernière phase de déscente vers la lune. Vous devez contrôler la puissance de ses moteurs pour qu'elle ne s'écrase pas.
                 Mais attention, le carburant est limité !
               </p>
             </a>
diff --git a/res/activity_functions.js b/res/activity_functions.js
index 686a508a5b0ecde7f389d4babdaaa359c037f37f..391dc5d9cfe27d92baa0045678cb5024eb9d35fa 100644
--- a/res/activity_functions.js
+++ b/res/activity_functions.js
@@ -107,6 +107,18 @@ function initApi(interpreter, scope) {
 	interpreter.setProperty(scope, 'isFuelEmpty',
 	interpreter.createNativeFunction(wrapper));
 
+	var wrapper = function(text) {
+		return getLanderSpeed();
+	};
+	interpreter.setProperty(scope, 'getLanderSpeed',
+	interpreter.createNativeFunction(wrapper));
+
+	var wrapper = function(text) {
+		return isLanderLanded();
+	};
+	interpreter.setProperty(scope, 'isLanderLanded',
+	interpreter.createNativeFunction(wrapper));
+
 	var wrapper = function(text) {
 		return changeRocketStage();
 	};
diff --git a/res/blocks/arduino_blocks_def.js b/res/blocks/arduino_blocks_def.js
index e924f07b9033cd50f10e083ff38de5461698187c..ec901a10eb511c62ec894c2948ad0123341a6db4 100644
--- a/res/blocks/arduino_blocks_def.js
+++ b/res/blocks/arduino_blocks_def.js
@@ -253,6 +253,42 @@ Blockly.Blocks['enable_manual_mode'] = {
   }
 };
 
+/* ACT 3 */
+
+Blockly.Blocks['set_lander_power_to'] = {
+  init: function() {
+    this.appendDummyInput()
+        .appendField("Mettre la puissance des moteurs à")
+        .appendField(new Blockly.FieldNumber(0, 0, 100, 1), "lander_power");
+    this.setPreviousStatement(true, null);
+    this.setNextStatement(true, null);
+    this.setColour(0);
+ this.setTooltip("Change la puissance des moteurs de l'aterrisseur");
+ this.setHelpUrl("");
+  }
+};
+
+Blockly.Blocks['lander_speed'] = {
+  init: function() {
+    this.appendDummyInput()
+        .appendField("vitesse verticale");
+    this.setOutput(true, "Number");
+    this.setColour(230);
+ this.setTooltip("renvoie la vitesse verticale du module lunaire");
+ this.setHelpUrl("");
+  }
+};
+
+Blockly.Blocks['is_lander_landed'] = {
+  init: function() {
+    this.appendDummyInput()
+        .appendField("le module a aluni");
+    this.setOutput(true, "Boolean");
+    this.setColour(230);
+ this.setTooltip("Si le module lunaire est posé sur la lune");
+ this.setHelpUrl("");
+  }
+};
 
 
 
diff --git a/res/blocks/arduino_blocks_gen.js b/res/blocks/arduino_blocks_gen.js
index 0d54254ed7572687ccd5699bc28f6104f1c344a6..11592d0c5cdff6d2cb7b041f615ec1690ea3294b 100644
--- a/res/blocks/arduino_blocks_gen.js
+++ b/res/blocks/arduino_blocks_gen.js
@@ -143,7 +143,28 @@ Blockly.JavaScript['enable_manual_mode'] = function(block) {
 
 
 
+/* ACTIVITE 3 */
 
+Blockly.JavaScript['set_lander_power_to'] = function(block) {
+  var number_power = block.getFieldValue('lander_power');
+  number_power = number_power/100.0;
+  var code = 'changePower('+  number_power +', 200);\n';
+  return code;
+};
+
+Blockly.JavaScript['lander_speed'] = function(block) {
+  // TODO: Assemble JavaScript into code variable.
+  var code = 'getLanderSpeed()';
+  // TODO: Change ORDER_NONE to the correct strength.
+  return [code, Blockly.JavaScript.ORDER_NONE];
+};
+
+Blockly.JavaScript['is_lander_landed'] = function(block) {
+  // TODO: Assemble JavaScript into code variable.
+  var code = 'isLanderLanded()';
+  // TODO: Change ORDER_NONE to the correct strength.
+  return [code, Blockly.JavaScript.ORDER_NONE];
+};
 
 
 /* ACTIVITE 4 */
diff --git a/res/img/activity_4/desktop.ini b/res/img/activity_4/desktop.ini
deleted file mode 100644
index 995bb2e84cfd5df6cfd67a0151684a5b03615531..0000000000000000000000000000000000000000
--- a/res/img/activity_4/desktop.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[.ShellClassInfo]
-InfoTip=Ce dossier est partagé en ligne.
-IconFile=C:\Program Files\Google\Drive\googledrivesync.exe
-IconIndex=16
-    
\ No newline at end of file