[plm] 01/10: Imported Upstream version 2.2.7

Martin Quinson mquinson at alioth.debian.org
Sun Oct 6 12:24:54 UTC 2013


This is an automated email from the git hooks/post-receive script.

mquinson pushed a commit to branch debian-debian
in repository plm.

commit 529872e142873c39899883849426d9039f8ea2ee
Author: Martin Quinson <martin.quinson at loria.fr>
Date:   Tue Oct 1 16:24:15 2013 +0200

    Imported Upstream version 2.2.7
---
 .classpath                                         |   26 +
 .project                                           |   24 +
 ChangeLog                                          |   63 ++
 checkDave.pl                                       |   41 +
 lib/appbundler-1.0.jar                             |  Bin 0 -> 133599 bytes
 lib/commons-logging-1.1.1.jar                      |  Bin 0 -> 60686 bytes
 lib/gettext-ant-tasks-0.9.3.jar                    |  Bin 0 -> 15581 bytes
 lib/gettext-commons-0.9.6.jar                      |  Bin 0 -> 16845 bytes
 lib/httpclient-4.2.5.jar                           |  Bin 0 -> 433368 bytes
 lib/httpcore-4.2.4.jar                             |  Bin 0 -> 227275 bytes
 lib/httpmime-4.2.5.jar                             |  Bin 0 -> 26477 bytes
 lib/jruby-1.5.6-5.jar                              |  Bin 0 -> 7810930 bytes
 lib/json_simple-1.1.jar                            |  Bin 0 -> 16057 bytes
 lib/jsyntaxpane-0.9.6~r156.jar                     |  Bin 0 -> 392908 bytes
 lib/junit-4.11.jar                                 |  Bin 0 -> 245039 bytes
 lib/jython/antlr3-runtime.jar                      |  Bin 0 -> 151576 bytes
 lib/jython/asm3-3.2.jar                            |  Bin 0 -> 209577 bytes
 lib/jython/jython-2.5.1.jar                        |  Bin 0 -> 4076286 bytes
 lib/l10n-engine/en.po                              |  189 +++--
 lib/l10n-engine/fr.po                              |  199 +++--
 lib/l10n-engine/plm.pot                            |  189 +++--
 lib/l10n/fr.po                                     |  889 +++++++++++---------
 lib/l10n/plm.pot                                   |  618 +++++++-------
 lib/langtools-beta.jar                             |  Bin 0 -> 1816969 bytes
 lib/miglayout-3.7.4.jar                            |  Bin 0 -> 276732 bytes
 lib/resources/plm.configuration.properties         |    6 +-
 lib/scala/scala-compiler-2.10.2.jar                |  Bin 0 -> 14411576 bytes
 lib/scala/scala-library-2.10.2.jar                 |  Bin 0 -> 7121811 bytes
 lib/scala/scala-reflect-2.10.2.jar                 |  Bin 0 -> 3171170 bytes
 lib/twitter4j-core-3.0.3.jar                       |  Bin 0 -> 284059 bytes
 po4a.conf                                          |   30 +-
 .../maze/shortestpath/ShortestPathMaze.fr.html     |    8 +-
 src/lessons/recursion/Main.java                    |    6 +-
 src/lessons/recursion/circle/Circle.fr.html        |   24 -
 src/lessons/recursion/circle/Circle.html           |   21 -
 src/lessons/recursion/circle/Circle.java           |   20 -
 src/lessons/recursion/circle/CircleEntity.java     |   22 -
 src/lessons/recursion/circle/CircleEntity.py       |   10 -
 src/lessons/recursion/circle/CircleEntity.scala    |   22 -
 .../recursion/dragoncurve/DragonCurve1Entity.java  |    8 +-
 .../recursion/dragoncurve/DragonCurve1Entity.py    |    8 +-
 .../recursion/dragoncurve/DragonCurve1Entity.scala |    8 +-
 .../recursion/dragoncurve/DragonCurve2Entity.java  |   16 +-
 .../recursion/dragoncurve/DragonCurve2Entity.py    |   16 +-
 src/lessons/recursion/hanoi/HanoiBoard.fr.html     |   39 +-
 src/lessons/recursion/hanoi/HanoiBoard.html        |   35 +-
 src/lessons/recursion/hanoi/HanoiBoard.java        |    6 +-
 src/lessons/recursion/hanoi/HanoiBoardEntity.java  |   22 +-
 src/lessons/recursion/hanoi/HanoiBoardEntity.py    |   15 +-
 src/lessons/recursion/hanoi/HanoiBoardEntity.scala |   20 +-
 src/lessons/recursion/koch/Koch.fr.html            |   21 +-
 src/lessons/recursion/koch/Koch.html               |   20 +-
 src/lessons/recursion/koch/KochEntity.java         |    4 +
 src/lessons/recursion/koch/KochEntity.py           |    2 +
 src/lessons/recursion/koch/KochEntity.scala        |    3 +
 .../recursion/sierpinski/Sierpinski.fr.html        |    7 +-
 src/lessons/recursion/sierpinski/Sierpinski.html   |    7 +-
 .../recursion/sierpinski/SierpinskiEntity.java     |   11 +-
 .../recursion/sierpinski/SierpinskiEntity.py       |    9 +-
 .../recursion/sierpinski/SierpinskiEntity.scala    |   10 +-
 src/lessons/recursion/spiral/SpiralUse.fr.html     |   51 +-
 src/lessons/recursion/spiral/SpiralUse.html        |   43 +-
 src/lessons/recursion/spiral/SpiralUse.java        |   26 +-
 src/lessons/recursion/spiral/SpiralUseEntity.java  |   16 +-
 src/lessons/recursion/spiral/SpiralUseEntity.py    |   16 +-
 src/lessons/recursion/spiral/SpiralUseEntity.scala |   17 +-
 src/lessons/recursion/spiral/example-1.png         |  Bin 0 -> 26119 bytes
 src/lessons/recursion/spiral/example-2.png         |  Bin 0 -> 3611 bytes
 src/lessons/recursion/spiral/example-3.png         |  Bin 0 -> 4737 bytes
 src/lessons/recursion/spiral/example-4.png         |  Bin 0 -> 2201 bytes
 src/lessons/recursion/star/Star.fr.html            |   15 -
 src/lessons/recursion/star/Star.html               |   14 -
 src/lessons/recursion/star/Star.java               |   20 -
 src/lessons/recursion/star/StarEntity.java         |   36 -
 src/lessons/recursion/star/StarEntity.py           |   24 -
 src/lessons/recursion/star/StarEntity.scala        |   36 -
 src/lessons/recursion/tree/Tree.fr.html            |   26 +-
 src/lessons/recursion/tree/Tree.html               |   20 +-
 src/lessons/recursion/tree/TreeEntity.java         |   44 +
 src/lessons/recursion/tree/TreeEntity.py           |   34 +-
 src/lessons/recursion/tree/TreeEntity.scala        |   46 +-
 src/lessons/sort/{ => basic}/Main.fr.html          |    0
 src/lessons/sort/{ => basic}/Main.html             |    0
 src/lessons/sort/{ => basic}/Main.java             |   26 +-
 .../sort/{ => basic}/bubble/AlgBubbleSort1.fr.html |    4 +-
 .../sort/{ => basic}/bubble/AlgBubbleSort1.html    |    0
 .../sort/{ => basic}/bubble/AlgBubbleSort1.java    |    2 +-
 .../{ => basic}/bubble/AlgBubbleSort1Entity.java   |    2 +-
 .../{ => basic}/bubble/AlgBubbleSort1Entity.py     |    0
 .../{ => basic}/bubble/AlgBubbleSort1Entity.scala  |    2 +-
 .../sort/{ => basic}/bubble/AlgBubbleSort2.fr.html |    2 +-
 .../sort/{ => basic}/bubble/AlgBubbleSort2.html    |    0
 .../sort/{ => basic}/bubble/AlgBubbleSort2.java    |    2 +-
 .../{ => basic}/bubble/AlgBubbleSort2Entity.java   |    2 +-
 .../{ => basic}/bubble/AlgBubbleSort2Entity.py     |    0
 .../{ => basic}/bubble/AlgBubbleSort2Entity.scala  |    2 +-
 .../sort/{ => basic}/bubble/AlgBubbleSort3.fr.html |   14 +-
 .../sort/{ => basic}/bubble/AlgBubbleSort3.html    |    7 +-
 .../sort/{ => basic}/bubble/AlgBubbleSort3.java    |    2 +-
 .../{ => basic}/bubble/AlgBubbleSort3Entity.java   |    2 +-
 .../{ => basic}/bubble/AlgBubbleSort3Entity.py     |    0
 .../{ => basic}/bubble/AlgBubbleSort3Entity.scala  |    2 +-
 .../{ => basic}/cocktail/AlgCocktailSort1.fr.html  |    0
 .../{ => basic}/cocktail/AlgCocktailSort1.html     |    0
 .../{ => basic}/cocktail/AlgCocktailSort1.java     |    2 +-
 .../cocktail/AlgCocktailSort1Entity.java           |    2 +-
 .../{ => basic}/cocktail/AlgCocktailSort1Entity.py |    0
 .../cocktail/AlgCocktailSort1Entity.scala          |    2 +-
 .../{ => basic}/cocktail/AlgCocktailSort2.fr.html  |    4 +-
 .../{ => basic}/cocktail/AlgCocktailSort2.html     |    4 +-
 .../{ => basic}/cocktail/AlgCocktailSort2.java     |    2 +-
 .../cocktail/AlgCocktailSort2Entity.java           |    2 +-
 .../{ => basic}/cocktail/AlgCocktailSort2Entity.py |    0
 .../cocktail/AlgCocktailSort2Entity.scala          |    2 +-
 .../{ => basic}/cocktail/AlgCocktailSort3.fr.html  |    4 +-
 .../{ => basic}/cocktail/AlgCocktailSort3.html     |    0
 .../{ => basic}/cocktail/AlgCocktailSort3.java     |    2 +-
 .../cocktail/AlgCocktailSort3Entity.java           |    2 +-
 .../{ => basic}/cocktail/AlgCocktailSort3Entity.py |    0
 .../cocktail/AlgCocktailSort3Entity.scala          |    2 +-
 .../sort/{ => basic}/comb/AlgCombSort.fr.html      |   15 +-
 src/lessons/sort/{ => basic}/comb/AlgCombSort.html |   12 +-
 src/lessons/sort/{ => basic}/comb/AlgCombSort.java |    2 +-
 .../sort/{ => basic}/comb/AlgCombSort11.fr.html    |    0
 .../sort/{ => basic}/comb/AlgCombSort11.html       |    0
 .../sort/{ => basic}/comb/AlgCombSort11.java       |    2 +-
 .../sort/{ => basic}/comb/AlgCombSort11Entity.java |    2 +-
 .../sort/{ => basic}/comb/AlgCombSort11Entity.py   |    0
 .../{ => basic}/comb/AlgCombSort11Entity.scala     |    2 +-
 .../sort/{ => basic}/comb/AlgCombSortEntity.java   |    2 +-
 .../sort/{ => basic}/comb/AlgCombSortEntity.py     |    0
 .../sort/{ => basic}/comb/AlgCombSortEntity.scala  |    4 +-
 .../sort/{ => basic}/gnome/AlgGnomeSort.fr.html    |    0
 .../sort/{ => basic}/gnome/AlgGnomeSort.html       |    0
 .../sort/{ => basic}/gnome/AlgGnomeSort.java       |    2 +-
 .../sort/{ => basic}/gnome/AlgGnomeSortEntity.java |    4 +-
 .../sort/{ => basic}/gnome/AlgGnomeSortEntity.py   |    2 +-
 .../{ => basic}/gnome/AlgGnomeSortEntity.scala     |    4 +-
 src/lessons/sort/{ => basic}/icon.png              |  Bin 1590 -> 1590 bytes
 .../{ => basic}/insertion/AlgInsertionSort.fr.html |   20 +-
 .../{ => basic}/insertion/AlgInsertionSort.html    |   18 +-
 .../{ => basic}/insertion/AlgInsertionSort.java    |    2 +-
 .../insertion/AlgInsertionSortEntity.java          |    2 +-
 .../insertion/AlgInsertionSortEntity.py            |    0
 .../insertion/AlgInsertionSortEntity.scala         |    2 +-
 .../{ => basic}/insertion/InsertionsortAfter.png   |  Bin 2137 -> 2137 bytes
 .../{ => basic}/insertion/InsertionsortBefore.png  |  Bin 2213 -> 2213 bytes
 .../{ => basic}/selection/AlgSelectionSort.fr.html |    0
 .../{ => basic}/selection/AlgSelectionSort.html    |    0
 .../{ => basic}/selection/AlgSelectionSort.java    |    2 +-
 .../selection/AlgSelectionSortEntity.java          |    2 +-
 .../selection/AlgSelectionSortEntity.py            |    0
 .../selection/AlgSelectionSortEntity.scala         |    2 +-
 .../sort/{ => basic}/shell/AlgShellSort.fr.html    |    0
 .../sort/{ => basic}/shell/AlgShellSort.html       |    0
 .../sort/{ => basic}/shell/AlgShellSort.java       |    2 +-
 .../sort/{ => basic}/shell/AlgShellSortEntity.java |    2 +-
 .../sort/{ => basic}/shell/AlgShellSortEntity.py   |    0
 .../{ => basic}/shell/AlgShellSortEntity.scala     |    2 +-
 src/lessons/sort/{ => basic}/short_desc.fr.html    |    0
 src/lessons/sort/{ => basic}/short_desc.html       |    0
 src/lessons/sort/dutchflag/DutchFlagAlgo.html      |   21 +
 src/lessons/sort/dutchflag/DutchFlagAlgo.java      |   27 +
 .../sort/dutchflag/DutchFlagAlgoEntity.java        |   39 +
 src/lessons/sort/dutchflag/DutchFlagAlgoEntity.py  |   17 +
 .../sort/dutchflag/DutchFlagAlgoEntity.scala       |   38 +
 src/lessons/sort/dutchflag/Main.html               |   15 +
 src/lessons/sort/dutchflag/Main.java               |   11 +
 src/lessons/sort/dutchflag/icon.png                |  Bin 0 -> 366 bytes
 src/lessons/sort/dutchflag/short_desc.html         |    3 +
 .../sort/dutchflag/universe/DutchFlagEntity.java   |   79 ++
 .../sort/dutchflag/universe/DutchFlagWorld.html    |   22 +
 .../sort/dutchflag/universe/DutchFlagWorld.java    |  247 ++++++
 .../dutchflag/universe/DutchFlagWorldView.java     |   99 +++
 .../sort/dutchflag/universe/world_dutchflag.png    |  Bin 0 -> 331 bytes
 .../sort/pancake/universe/PancakeWorld.fr.html     |    2 +-
 .../sort/pancake/universe/PancakeWorld.java        |    5 +-
 src/lessons/turtleart/FlowerEntity.java            |   39 +
 src/lessons/turtleart/FlowerEntity.py              |   28 +
 src/lessons/turtleart/FlowerEntity.scala           |   40 +
 src/lessons/turtleart/Main.java                    |    5 +
 src/lessons/turtleart/StarEntity.java              |    1 +
 src/lessons/turtleart/StarEntity.py                |    1 +
 src/lessons/turtleart/StarEntity.scala             |    2 +
 src/lessons/welcome/array/basics/Array2Entity.py   |    1 -
 src/lessons/welcome/array/has271/Has271.fr.html    |    3 +-
 src/lessons/welcome/variables/Variables.fr.html    |    7 +-
 src/plm/core/ExoTest.java                          |    2 +-
 src/plm/core/model/session/FileSessionKit.java     |  209 -----
 src/plm/core/ui/AboutWorldDialog.java              |   21 +-
 src/plm/core/ui/ChooseLectureDialog.java           |    2 +-
 src/plm/core/ui/ChooseLessonDialog.java            |    2 +-
 src/plm/core/ui/MainFrame.java                     |    7 +-
 src/plm/core/ui/StatusBar.java                     |   11 +
 src/plm/core/ui/action/ExportCloudSession.java     |    1 +
 src/plm/core/ui/action/ImportCloudSession.java     |   20 +-
 .../ui/editor/buggleeditor/PropertiesEditor.java   |    6 +-
 src/plm/universe/bugglequest/AbstractBuggle.java   |   32 +-
 src/plm/universe/bugglequest/Buggle.java           |    2 +-
 src/plm/universe/bugglequest/BuggleWorld.fr.html   |   24 +-
 src/plm/universe/bugglequest/BuggleWorld.html      |   24 +-
 src/plm/universe/bugglequest/BuggleWorld.java      |   15 +-
 .../universe/bugglequest/ui/BuggleButtonPanel.java |    4 +-
 .../universe/bugglequest/ui/BuggleWorldView.java   |    2 +-
 src/plm/universe/sort/SortingWorld.fr.html         |    2 +-
 src/plm/universe/sort/SortingWorld.java            |  109 ++-
 src/plm/universe/sort/SortingWorldView.java        |   33 +-
 src/plm/universe/turtles/Line.java                 |   52 +-
 src/plm/universe/turtles/TurtleWorld.fr.html       |   19 +
 src/plm/universe/turtles/TurtleWorld.html          |   19 +
 src/plm/universe/turtles/TurtleWorld.java          |   99 ++-
 211 files changed, 2960 insertions(+), 1897 deletions(-)

diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..ae98425
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry including="**" kind="src" path="src"/>
+	<classpathentry excluding="*" including="img/*.png|img/*/*.png" kind="src" path=""/>
+	<classpathentry excluding="*.jar" including="resources|resources/" kind="src" path="lib"/>
+	<classpathentry kind="lib" path="lib/miglayout-3.7.4.jar"/>
+	<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="lib/twitter4j-core-3.0.3.jar"/>
+	<classpathentry kind="lib" path="lib/httpclient-4.2.5.jar"/>
+	<classpathentry kind="lib" path="lib/httpcore-4.2.4.jar"/>
+	<classpathentry kind="lib" path="lib/httpmime-4.2.5.jar"/>
+	<classpathentry kind="lib" path="lib/commons-logging-1.1.1.jar"/>
+	<classpathentry kind="lib" path="lib/jython/antlr3-runtime.jar"/>
+	<classpathentry kind="lib" path="lib/jython/jython-2.5.1.jar"/>
+	<classpathentry kind="lib" path="lib/jython/asm3-3.2.jar"/>
+	<classpathentry kind="lib" path="lib/json_simple-1.1.jar"/>
+	<classpathentry kind="lib" path="lib/jruby-1.5.6-5.jar"/>
+	<classpathentry kind="lib" path="lib/gettext-commons-0.9.6.jar"/>
+	<classpathentry kind="lib" path="lib/plm-messages.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/jsyntaxpane-0.9.6~r156.jar"/>
+	<classpathentry kind="lib" path="lib/scala/scala-compiler-2.10.2.jar"/>
+	<classpathentry kind="lib" path="lib/scala/scala-library-2.10.2.jar"/>
+	<classpathentry kind="lib" path="lib/scala/scala-reflect-2.10.2.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/.project b/.project
new file mode 100644
index 0000000..53fab90
--- /dev/null
+++ b/.project
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>PLM</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.python.pydev.PyDevBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.scala-ide.sdt.core.scalabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.scala-ide.sdt.core.scalanature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.python.pydev.pythonNature</nature>
+	</natures>
+</projectDescription>
diff --git a/ChangeLog b/ChangeLog
index fa70577..2e370b6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,66 @@
+20130930: Release 2.2.7
+
+  * recursion.spiralUse: rewrite to leverage the creative mode,
+    so that students don't spend too much time seeking for the reward.
+  * recursion.tree: make the color changing robust to negative steps
+  * recursion.tree: forbid teleporting 
+    This was used by some students to make the method idempotent.
+  * recursion.sierpinski: rewrite to simplify the code to be written
+  * recursion.hanoi: Simplify by explicitely passing the index of the
+    unused peg to the recursive function.
+  * TurtleWorld: synchronize to avoid a concurent modification when a
+    shape is added while we are computing the toString() of the world
+  * sort.dutchflag: New universe/exercise on the Dutch Flag Sorting
+  * sort.pancake: Correctly reset the move count on need
+  * sort.insertion: fix path to img after recent package reorg
+  * recursion.koch: give one color per side to ease the understanding
+  * sort.CocktailSort2: don't use ++ but += 1 in pseudocode
+
+20130924: Release 2.2.6
+
+  * SortingView: display the value on the left of temporal view, not
+    the index
+  * TurtleArt: force a newline every 5 exercises as it does not work
+    well with Java7 otherwise.
+  * TurtleArt.Flower: new exercise (provided by a student :)
+  * GnomeSort: fix a bug in the correction, where we stay at i=0 when
+    there is no previous pot instead of moving forward.
+  * TurtleWorld.equals&diffTo: synchronized on shapes to avoid issues
+    when the stop is pressed, for example
+  * TurtleWorld: order the points in each segment so that the line
+    (ab, cd) is detected as equal to (cd, ab)
+  * TurtleWorld.diffTo: i18n and improve error messages
+  * recursion.Circle: kill exercise. It is superseeded by turtleart.
+  * recursion.Star: kill exercise. It is superseeded by turtleart.
+  * recursion.tree: rework to make it easier to understand
+    - each level is given its own color
+    - we provide a subtree() that is correct (but the colors) to ease
+      the debugging of user's code
+  * As usual, fix a bunch of typos in the French translation
+
+20130916: Release 2.2.5: SortingWorld needs *more* polishing.
+
+  * Align equals() and diffTo() of sortedWorld to avoid false negatives
+  * Internationalize and translate the error messages of SortedWorld
+  * sort.Bubble3: there is no 'break' in scala
+  * Color the statusbar in red when a world is running so that people
+    notice that there is more than one world.
+  * SortingWorld: give large worlds a reduced delay so that people
+    don't wait for the perf world too much even if they don't click
+
+20130916: Release 2.2.4: SortingWorld also needs polishing.
+
+  * Disable the "help me" button if the appengine is disabled
+  * Document the existing colors in Buggle&Turtle worlds
+  * Update "About world" dialog's title changed on Human lang switches
+  * Change buggle.setColor to setBodyColor so that people used to logo
+    don't use it  to change the brush color.
+  * Compare turtle worlds with an upsilon to avoid false negatives.
+  * Fix an error in the pseudocode of CombSort
+  * Fix a bunch of typos in the French translations.
+  * sorting world: represent values as letters so that they don't get
+    mixed with indexes. 
+
 20130912: Release 2.2.3: Let's start adding new bu^Wfeatures again.
 
   * Let every interactive control issue the source code doing the same
diff --git a/checkDave.pl b/checkDave.pl
new file mode 100755
index 0000000..30c9e72
--- /dev/null
+++ b/checkDave.pl
@@ -0,0 +1,41 @@
+#! /usr/bin/perl
+
+use strict;
+
+my @files = qx(find src -name '*.java' -or -name '*.scala' -or -name '*.py');
+
+my $error = 0;
+
+foreach my $file (sort @files) {
+    chomp ($file);
+    my $filectn;
+    my $FH;
+    open (FH,"<$file") || die "Cannot open $file: $!\n";
+      
+    while (<FH>) {
+	next unless ($_ =~ /Dave/);
+	my $line = $_;
+	$line =~ s/throw new RuntimeException\(Game.i18n.tr\((.*?)\)\);/$1/;
+	
+	if      ($line =~ /"Sorry Dave, I cannot let you use forward with an argument in this exercise. Use a loop instead."/) {
+	} elsif ($line =~ /"Sorry Dave, I cannot let you use backward with an argument in this exercise. Use a loop instead."/) {
+	    
+	    # traversals
+	} elsif ($line =~ /"Sorry Dave, I cannot let you use forward\(\) in this exercise. Use setPos\(x,y\) instead."/) {
+	} elsif ($line =~ /"Sorry Dave, I cannot let you use backward\(\) in this exercise. Use setPos\(x,y\) instead."/) {
+
+	    # dogHouse
+	} elsif ($line =~ /"Sorry Dave, I cannot let you use right\(\) in this exercise. Use left\(\) instead."/) {
+	} elsif ($line =~ /"Sorry Dave, I cannot let you use left\(\) both in lines \{0\} and \{1\} in this exercise. You can write left\(\) only once in this exercise."/) {
+	    
+	    # mazes
+	} elsif ($line =~ /"Sorry Dave, I cannot let you use setX\(x\) in this exercise. Walk to your goal instead."/) {
+	} elsif ($line =~ /"Sorry Dave, I cannot let you use setY\(y\) in this exercise. Walk to your goal instead."/) {
+	} elsif ($line =~ /"Sorry Dave, I cannot let you use setPos\(x,y\) in this exercise. Walk to your goal instead."/) {
+	} else {
+	    $error++;
+	    print STDERR "$file : $line";
+	}
+    }
+}
+print "#errors: $error\n";
\ No newline at end of file
diff --git a/lib/appbundler-1.0.jar b/lib/appbundler-1.0.jar
new file mode 100644
index 0000000..ef30f1c
Binary files /dev/null and b/lib/appbundler-1.0.jar differ
diff --git a/lib/commons-logging-1.1.1.jar b/lib/commons-logging-1.1.1.jar
new file mode 100644
index 0000000..1deef14
Binary files /dev/null and b/lib/commons-logging-1.1.1.jar differ
diff --git a/lib/gettext-ant-tasks-0.9.3.jar b/lib/gettext-ant-tasks-0.9.3.jar
new file mode 100644
index 0000000..3ee21f1
Binary files /dev/null and b/lib/gettext-ant-tasks-0.9.3.jar differ
diff --git a/lib/gettext-commons-0.9.6.jar b/lib/gettext-commons-0.9.6.jar
new file mode 100644
index 0000000..115ae64
Binary files /dev/null and b/lib/gettext-commons-0.9.6.jar differ
diff --git a/lib/httpclient-4.2.5.jar b/lib/httpclient-4.2.5.jar
new file mode 100644
index 0000000..5310588
Binary files /dev/null and b/lib/httpclient-4.2.5.jar differ
diff --git a/lib/httpcore-4.2.4.jar b/lib/httpcore-4.2.4.jar
new file mode 100644
index 0000000..9f45bd9
Binary files /dev/null and b/lib/httpcore-4.2.4.jar differ
diff --git a/lib/httpmime-4.2.5.jar b/lib/httpmime-4.2.5.jar
new file mode 100644
index 0000000..e63b24d
Binary files /dev/null and b/lib/httpmime-4.2.5.jar differ
diff --git a/lib/jruby-1.5.6-5.jar b/lib/jruby-1.5.6-5.jar
new file mode 100644
index 0000000..84e6949
Binary files /dev/null and b/lib/jruby-1.5.6-5.jar differ
diff --git a/lib/json_simple-1.1.jar b/lib/json_simple-1.1.jar
new file mode 100644
index 0000000..8135711
Binary files /dev/null and b/lib/json_simple-1.1.jar differ
diff --git a/lib/jsyntaxpane-0.9.6~r156.jar b/lib/jsyntaxpane-0.9.6~r156.jar
new file mode 100644
index 0000000..dcc27c5
Binary files /dev/null and b/lib/jsyntaxpane-0.9.6~r156.jar differ
diff --git a/lib/junit-4.11.jar b/lib/junit-4.11.jar
new file mode 100644
index 0000000..aaf7444
Binary files /dev/null and b/lib/junit-4.11.jar differ
diff --git a/lib/jython/antlr3-runtime.jar b/lib/jython/antlr3-runtime.jar
new file mode 100644
index 0000000..f8f4208
Binary files /dev/null and b/lib/jython/antlr3-runtime.jar differ
diff --git a/lib/jython/asm3-3.2.jar b/lib/jython/asm3-3.2.jar
new file mode 100644
index 0000000..1edb2e6
Binary files /dev/null and b/lib/jython/asm3-3.2.jar differ
diff --git a/lib/jython/jython-2.5.1.jar b/lib/jython/jython-2.5.1.jar
new file mode 100644
index 0000000..f235e68
Binary files /dev/null and b/lib/jython/jython-2.5.1.jar differ
diff --git a/lib/l10n-engine/en.po b/lib/l10n-engine/en.po
index 926167a..39e8a6c 100644
--- a/lib/l10n-engine/en.po
+++ b/lib/l10n-engine/en.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-12 21:44+0200\n"
+"POT-Creation-Date: 2013-09-24 01:33+0200\n"
 "PO-Revision-Date: 2013-09-12 13:06+0200\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -713,7 +713,8 @@ msgstr "About PLM dialogTitle"
 msgid "Close"
 msgstr "Close"
 
-#: src/plm/core/ui/AboutWorldDialog.java:32
+#: src/plm/core/ui/AboutWorldDialog.java:31
+#: src/plm/core/ui/AboutWorldDialog.java:50
 #, fuzzy, java-format
 msgid "About world - {0}"
 msgstr "About world - "
@@ -739,12 +740,12 @@ msgid ""
 msgstr ""
 
 #: src/plm/core/ui/ChooseLessonDialog.java:132
-#: src/plm/core/ui/MainFrame.java:165
+#: src/plm/core/ui/MainFrame.java:168
 msgid "PLM lesson files"
 msgstr "PLM lesson files"
 
 #: src/plm/core/ui/ChooseLessonDialog.java:141
-#: src/plm/core/ui/MainFrame.java:174
+#: src/plm/core/ui/MainFrame.java:177
 msgid "Error"
 msgstr "Error"
 
@@ -905,142 +906,142 @@ msgstr "Where error and other messages get written"
 #. === FILE menu ===
 #. for now: leave the calls to i18n.tr: that way one is sure to get all the localized strings...
 #. Menus
-#: src/plm/core/ui/MainFrame.java:154 src/plm/core/ui/MainFrame.java:670
+#: src/plm/core/ui/MainFrame.java:157 src/plm/core/ui/MainFrame.java:675
 msgid "File"
 msgstr "File"
 
-#: src/plm/core/ui/MainFrame.java:156
+#: src/plm/core/ui/MainFrame.java:159
 msgid "File related functions"
 msgstr "File related functions"
 
-#: src/plm/core/ui/MainFrame.java:159 src/plm/core/ui/MainFrame.java:671
+#: src/plm/core/ui/MainFrame.java:162 src/plm/core/ui/MainFrame.java:676
 msgid "Load lesson"
 msgstr "Load lesson"
 
-#: src/plm/core/ui/MainFrame.java:181 src/plm/core/ui/MainFrame.java:672
+#: src/plm/core/ui/MainFrame.java:184 src/plm/core/ui/MainFrame.java:677
 msgid "Switch lesson"
 msgstr "Switch lesson"
 
-#: src/plm/core/ui/MainFrame.java:193 src/plm/core/ui/MainFrame.java:439
-#: src/plm/core/ui/MainFrame.java:667 src/plm/core/ui/MainFrame.java:673
+#: src/plm/core/ui/MainFrame.java:196 src/plm/core/ui/MainFrame.java:444
+#: src/plm/core/ui/MainFrame.java:672 src/plm/core/ui/MainFrame.java:678
 msgid "Switch exercise"
 msgstr "Switch exercise"
 
-#: src/plm/core/ui/MainFrame.java:206 src/plm/core/ui/MainFrame.java:675
+#: src/plm/core/ui/MainFrame.java:209 src/plm/core/ui/MainFrame.java:680
 msgid "Teacher Console"
 msgstr "Teacher Console"
 
 #. Menu item to change the current Course
-#: src/plm/core/ui/MainFrame.java:225 src/plm/core/ui/MainFrame.java:676
+#: src/plm/core/ui/MainFrame.java:228 src/plm/core/ui/MainFrame.java:681
 msgid "Choose your course"
 msgstr "Choose your course"
 
-#: src/plm/core/ui/MainFrame.java:244 src/plm/core/ui/MainFrame.java:677
+#: src/plm/core/ui/MainFrame.java:247 src/plm/core/ui/MainFrame.java:682
 msgid "Quit"
 msgstr "Quit"
 
 #. === Edit menu ===
-#: src/plm/core/ui/MainFrame.java:252 src/plm/core/ui/MainFrame.java:679
+#: src/plm/core/ui/MainFrame.java:255 src/plm/core/ui/MainFrame.java:684
 msgid "Session"
 msgstr "Session"
 
-#: src/plm/core/ui/MainFrame.java:257 src/plm/core/ui/MainFrame.java:681
+#: src/plm/core/ui/MainFrame.java:260 src/plm/core/ui/MainFrame.java:686
 msgid "Revert Exercise"
 msgstr "Revert Exercise"
 
-#: src/plm/core/ui/MainFrame.java:260 src/plm/core/ui/MainFrame.java:682
+#: src/plm/core/ui/MainFrame.java:263 src/plm/core/ui/MainFrame.java:687
 msgid "Export Session Cache"
 msgstr "Export Session Cache"
 
-#: src/plm/core/ui/MainFrame.java:263 src/plm/core/ui/MainFrame.java:683
+#: src/plm/core/ui/MainFrame.java:266 src/plm/core/ui/MainFrame.java:688
 msgid "Import Session Cache"
 msgstr "Import Session Cache"
 
-#: src/plm/core/ui/MainFrame.java:268 src/plm/core/ui/MainFrame.java:684
+#: src/plm/core/ui/MainFrame.java:271 src/plm/core/ui/MainFrame.java:689
 #, fuzzy
 msgid "Export Session Cache to Cloud"
 msgstr "Export Session Cache"
 
-#: src/plm/core/ui/MainFrame.java:271 src/plm/core/ui/MainFrame.java:685
+#: src/plm/core/ui/MainFrame.java:274 src/plm/core/ui/MainFrame.java:690
 #, fuzzy
 msgid "Import Session Cache from Cloud"
 msgstr "Import Session Cache"
 
-#: src/plm/core/ui/MainFrame.java:277 src/plm/core/ui/MainFrame.java:687
+#: src/plm/core/ui/MainFrame.java:280 src/plm/core/ui/MainFrame.java:692
 msgid "Debug mode"
 msgstr "Debug mode"
 
-#: src/plm/core/ui/MainFrame.java:288 src/plm/core/ui/MainFrame.java:688
+#: src/plm/core/ui/MainFrame.java:291 src/plm/core/ui/MainFrame.java:693
 msgid "Creative mode"
 msgstr ""
 
 #. === Language menu ===
-#: src/plm/core/ui/MainFrame.java:301 src/plm/core/ui/MainFrame.java:691
+#: src/plm/core/ui/MainFrame.java:304 src/plm/core/ui/MainFrame.java:696
 msgid "Language"
 msgstr "Language"
 
 #. === Programming language changing ===
-#: src/plm/core/ui/MainFrame.java:306 src/plm/core/ui/MainFrame.java:692
+#: src/plm/core/ui/MainFrame.java:309 src/plm/core/ui/MainFrame.java:697
 msgid "Human"
 msgstr "Human"
 
-#: src/plm/core/ui/MainFrame.java:320 src/plm/core/ui/MainFrame.java:693
+#: src/plm/core/ui/MainFrame.java:323 src/plm/core/ui/MainFrame.java:698
 msgid "Computer"
 msgstr "Computer"
 
 #. === Help menu ===
-#: src/plm/core/ui/MainFrame.java:324 src/plm/core/ui/MainFrame.java:695
+#: src/plm/core/ui/MainFrame.java:327 src/plm/core/ui/MainFrame.java:700
 msgid "Help"
 msgstr "Help"
 
-#: src/plm/core/ui/MainFrame.java:328 src/plm/core/ui/MainFrame.java:696
+#: src/plm/core/ui/MainFrame.java:331 src/plm/core/ui/MainFrame.java:701
 msgid "Provide feedback"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:338 src/plm/core/ui/MainFrame.java:697
+#: src/plm/core/ui/MainFrame.java:341 src/plm/core/ui/MainFrame.java:702
 msgid "About this lesson"
 msgstr "About this lesson"
 
-#: src/plm/core/ui/MainFrame.java:351 src/plm/core/ui/MainFrame.java:698
+#: src/plm/core/ui/MainFrame.java:354 src/plm/core/ui/MainFrame.java:703
 msgid "About this world"
 msgstr "About this world"
 
-#: src/plm/core/ui/MainFrame.java:367 src/plm/core/ui/MainFrame.java:700
+#: src/plm/core/ui/MainFrame.java:370 src/plm/core/ui/MainFrame.java:705
 msgid "About PLM"
 msgstr "About PLM"
 
 #. Buttons
-#: src/plm/core/ui/MainFrame.java:400 src/plm/core/ui/MainFrame.java:661
+#: src/plm/core/ui/MainFrame.java:403 src/plm/core/ui/MainFrame.java:666
 msgid "Run"
 msgstr "Run"
 
-#: src/plm/core/ui/MainFrame.java:404 src/plm/core/ui/MainFrame.java:502
-#: src/plm/core/ui/MainFrame.java:662
+#: src/plm/core/ui/MainFrame.java:407 src/plm/core/ui/MainFrame.java:507
+#: src/plm/core/ui/MainFrame.java:667
 msgid "Step"
 msgstr "Step"
 
-#: src/plm/core/ui/MainFrame.java:409 src/plm/core/ui/MainFrame.java:663
+#: src/plm/core/ui/MainFrame.java:412 src/plm/core/ui/MainFrame.java:668
 msgid "Stop"
 msgstr "Stop"
 
-#: src/plm/core/ui/MainFrame.java:415 src/plm/core/ui/MainFrame.java:664
+#: src/plm/core/ui/MainFrame.java:418 src/plm/core/ui/MainFrame.java:669
 msgid "Reset"
 msgstr "Reset"
 
-#: src/plm/core/ui/MainFrame.java:421 src/plm/core/ui/MainFrame.java:665
+#: src/plm/core/ui/MainFrame.java:424 src/plm/core/ui/MainFrame.java:670
 msgid "Demo"
 msgstr "Demo"
 
-#: src/plm/core/ui/MainFrame.java:427 src/plm/core/ui/MainFrame.java:666
+#: src/plm/core/ui/MainFrame.java:430 src/plm/core/ui/MainFrame.java:671
 #: src/plm/core/ui/action/HelpMe.java:37
 msgid "Call for Help"
 msgstr "Call for Help"
 
-#: src/plm/core/ui/MainFrame.java:487
+#: src/plm/core/ui/MainFrame.java:492
 msgid "Next"
 msgstr "Next"
 
-#: src/plm/core/ui/MainFrame.java:680
+#: src/plm/core/ui/MainFrame.java:685
 msgid "Lesson related functions"
 msgstr "Lesson related functions"
 
@@ -1062,23 +1063,23 @@ msgstr "Type your code here"
 msgid "<img> tag without src attribute in exercise {0}"
 msgstr ""
 
-#: src/plm/core/ui/StatusBar.java:113
+#: src/plm/core/ui/StatusBar.java:117
 msgid "Saving"
 msgstr "Saving"
 
-#: src/plm/core/ui/StatusBar.java:117
+#: src/plm/core/ui/StatusBar.java:122
 msgid "Compiling"
 msgstr "Compiling"
 
-#: src/plm/core/ui/StatusBar.java:131
+#: src/plm/core/ui/StatusBar.java:138
 msgid "Running "
 msgstr "Running "
 
-#: src/plm/core/ui/StatusBar.java:135
+#: src/plm/core/ui/StatusBar.java:143
 msgid "Playing demo "
 msgstr "Playing demo "
 
-#: src/plm/core/ui/StatusBar.java:139
+#: src/plm/core/ui/StatusBar.java:148
 #, fuzzy
 msgid "Loading "
 msgstr "Loading"
@@ -1102,14 +1103,14 @@ msgstr ""
 msgid "Export success"
 msgstr ""
 
-#: src/plm/core/ui/action/ExportCloudSession.java:131
+#: src/plm/core/ui/action/ExportCloudSession.java:132
 #, java-format
 msgid ""
 "<html>Export to cloud failed.<br/>{0}<br/>Caution! Your session is not saved "
 "yet.</html>"
 msgstr ""
 
-#: src/plm/core/ui/action/ExportCloudSession.java:132
+#: src/plm/core/ui/action/ExportCloudSession.java:133
 msgid "Export error"
 msgstr ""
 
@@ -1117,30 +1118,38 @@ msgstr ""
 msgid "Cancel call"
 msgstr "Cancel call"
 
-#: src/plm/core/ui/action/ImportCloudSession.java:131
+#: src/plm/core/ui/action/ImportCloudSession.java:84
+msgid "Download failed - Please check the code you entered."
+msgstr ""
+
+#: src/plm/core/ui/action/ImportCloudSession.java:133
 msgid "Please enter your personal code to retrieve your session"
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:132
+#: src/plm/core/ui/action/ImportCloudSession.java:134
 #, fuzzy
 msgid "Session code"
 msgstr "Session"
 
-#: src/plm/core/ui/action/ImportCloudSession.java:150
+#: src/plm/core/ui/action/ImportCloudSession.java:153
 msgid "Your session has been successfully imported."
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:151
+#: src/plm/core/ui/action/ImportCloudSession.java:154
 #, fuzzy
 msgid "Importation suceeded"
 msgstr "Import Session Cache"
 
-#: src/plm/core/ui/action/ImportCloudSession.java:155
+#: src/plm/core/ui/action/ImportCloudSession.java:156
+msgid "Something unexpected went wrong during downloading"
+msgstr ""
+
+#: src/plm/core/ui/action/ImportCloudSession.java:161
 #, java-format
 msgid "A {0} exception occured while importing your session: {1}"
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:156
+#: src/plm/core/ui/action/ImportCloudSession.java:162
 #, fuzzy
 msgid "Importation error"
 msgstr "Compilation error"
@@ -1562,17 +1571,17 @@ msgid ""
 "Parse error. I was expecting a cell or a buggle description but got: {0}"
 msgstr ""
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:542
+#: src/plm/universe/bugglequest/BuggleWorld.java:551
 #, java-format
 msgid "  The world''s name is {0}"
 msgstr ""
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:546
+#: src/plm/universe/bugglequest/BuggleWorld.java:555
 #, java-format
 msgid "  In ({0},{1})"
 msgstr ""
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:549
+#: src/plm/universe/bugglequest/BuggleWorld.java:558
 #, java-format
 msgid "  Something is wrong about buggle ''{0}'':\n"
 msgstr ""
@@ -1733,3 +1742,75 @@ msgstr ""
 #: src/plm/universe/sort/SortingButtonPanel.java:108
 msgid "copy"
 msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:115
+#, java-format
+msgid ""
+"This is very weird: There is not the same amount of values! Expected: {0}; "
+"Found: {1}\n"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:118
+#, java-format
+msgid "Invalid read count. Expected: {0}; Found: {1}\n"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:121
+#, java-format
+msgid "Invalid write count. Expected: {0}; Found: {1}\n"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:125
+#, java-format
+msgid "Value at index {0} differs. Expected {1}; Found {2}\n"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:351
+#: src/plm/universe/sort/SortingWorld.java:352
+#, java-format
+msgid "Out of bounds in swap({0},{1}): {2}<0"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:353
+#: src/plm/universe/sort/SortingWorld.java:354
+#, java-format
+msgid "Out of bounds in swap({0},{1}): {2}>value count"
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:75
+msgid "x1 differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:77
+msgid "x2 differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:79
+msgid "y1 differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:81
+msgid "y2 differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:83
+msgid "The color differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:84
+msgid "I dont see the difference (please report this bug)."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:86
+msgid "That's not a line."
+msgstr ""
+
+#: src/plm/universe/turtles/TurtleWorld.java:235
+#, java-format
+msgid "  There is only {0} shapes where {1} shapes were expected\n"
+msgstr ""
+
+#: src/plm/universe/turtles/TurtleWorld.java:238
+#, java-format
+msgid "  {0} (got {1} instead of {2})\n"
+msgstr ""
diff --git a/lib/l10n-engine/fr.po b/lib/l10n-engine/fr.po
index 735f84b..b64adaf 100644
--- a/lib/l10n-engine/fr.po
+++ b/lib/l10n-engine/fr.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PLM\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-12 21:44+0200\n"
-"PO-Revision-Date: 2013-09-12 21:47+0200\n"
+"POT-Creation-Date: 2013-09-24 01:33+0200\n"
+"PO-Revision-Date: 2013-09-24 01:35+0200\n"
 "Last-Translator: Martin Quinson <martin.quinson at loria.fr> and Frank STENGEL "
 "<fstengel at mac.com>\n"
 "Language-Team: not really\n"
@@ -829,7 +829,8 @@ msgstr "À propos de PLM"
 msgid "Close"
 msgstr "Fermer"
 
-#: src/plm/core/ui/AboutWorldDialog.java:32
+#: src/plm/core/ui/AboutWorldDialog.java:31
+#: src/plm/core/ui/AboutWorldDialog.java:50
 #, java-format
 msgid "About world - {0}"
 msgstr "À propos du monde - {0}"
@@ -854,7 +855,7 @@ msgid ""
 msgstr ""
 "<table border=\"0\" align=\"center\"><tr>\n"
 "<td valign=\"center\"><img src=\"img/world_buggle.png\" /></td>\n"
-"<td valign=\"center\">  <font size=\"+2\">Bienvenus dans PLM, "
+"<td valign=\"center\">  <font size=\"+2\">Bienvenu dans PLM, "
 "l'exerciseur du programmeur</font>  </td>\n"
 "<td valign=\"center\"><img src=\"img/world_buggle.png\" /></td>\n"
 "</tr></table>\n"
@@ -865,12 +866,12 @@ msgstr ""
 "d'apprendre à votre rythme.</font></p><br/>"
 
 #: src/plm/core/ui/ChooseLessonDialog.java:132
-#: src/plm/core/ui/MainFrame.java:165
+#: src/plm/core/ui/MainFrame.java:168
 msgid "PLM lesson files"
 msgstr "Fichiers de leçons pour la PLM"
 
 #: src/plm/core/ui/ChooseLessonDialog.java:141
-#: src/plm/core/ui/MainFrame.java:174
+#: src/plm/core/ui/MainFrame.java:177
 msgid "Error"
 msgstr "Erreur"
 
@@ -1035,7 +1036,7 @@ msgstr "Annuler"
 #: src/plm/core/ui/FeedbackDialog.java:95
 msgid "Do you really want to cancel your feedback and lose any edit?"
 msgstr ""
-"Voullez vous vraiment annuler votre retour et perdre ce que vous avez écrit ?"
+"Voulez-vous vraiment annuler votre retour et perdre ce que vous avez écrit ?"
 
 #: src/plm/core/ui/FeedbackDialog.java:96
 msgid "are you sure?"
@@ -1061,140 +1062,140 @@ msgstr "Endroit ou les erreurs et autres messages sont écrits"
 #. === FILE menu ===
 #. for now: leave the calls to i18n.tr: that way one is sure to get all the localized strings...
 #. Menus
-#: src/plm/core/ui/MainFrame.java:154 src/plm/core/ui/MainFrame.java:670
+#: src/plm/core/ui/MainFrame.java:157 src/plm/core/ui/MainFrame.java:675
 msgid "File"
 msgstr "Fichier"
 
-#: src/plm/core/ui/MainFrame.java:156
+#: src/plm/core/ui/MainFrame.java:159
 msgid "File related functions"
 msgstr "Fonction relatives à la gestion de fichiers"
 
-#: src/plm/core/ui/MainFrame.java:159 src/plm/core/ui/MainFrame.java:671
+#: src/plm/core/ui/MainFrame.java:162 src/plm/core/ui/MainFrame.java:676
 msgid "Load lesson"
 msgstr "Charger Leçon"
 
-#: src/plm/core/ui/MainFrame.java:181 src/plm/core/ui/MainFrame.java:672
+#: src/plm/core/ui/MainFrame.java:184 src/plm/core/ui/MainFrame.java:677
 msgid "Switch lesson"
 msgstr "Sélectionner une leçon"
 
-#: src/plm/core/ui/MainFrame.java:193 src/plm/core/ui/MainFrame.java:439
-#: src/plm/core/ui/MainFrame.java:667 src/plm/core/ui/MainFrame.java:673
+#: src/plm/core/ui/MainFrame.java:196 src/plm/core/ui/MainFrame.java:444
+#: src/plm/core/ui/MainFrame.java:672 src/plm/core/ui/MainFrame.java:678
 msgid "Switch exercise"
 msgstr "Changer d'exercice"
 
-#: src/plm/core/ui/MainFrame.java:206 src/plm/core/ui/MainFrame.java:675
+#: src/plm/core/ui/MainFrame.java:209 src/plm/core/ui/MainFrame.java:680
 msgid "Teacher Console"
 msgstr "Console enseignant"
 
 #. Menu item to change the current Course
-#: src/plm/core/ui/MainFrame.java:225 src/plm/core/ui/MainFrame.java:676
+#: src/plm/core/ui/MainFrame.java:228 src/plm/core/ui/MainFrame.java:681
 msgid "Choose your course"
 msgstr "Sélectionner un cours"
 
-#: src/plm/core/ui/MainFrame.java:244 src/plm/core/ui/MainFrame.java:677
+#: src/plm/core/ui/MainFrame.java:247 src/plm/core/ui/MainFrame.java:682
 msgid "Quit"
 msgstr "Quitter"
 
 #. === Edit menu ===
-#: src/plm/core/ui/MainFrame.java:252 src/plm/core/ui/MainFrame.java:679
+#: src/plm/core/ui/MainFrame.java:255 src/plm/core/ui/MainFrame.java:684
 msgid "Session"
 msgstr "Session"
 
-#: src/plm/core/ui/MainFrame.java:257 src/plm/core/ui/MainFrame.java:681
+#: src/plm/core/ui/MainFrame.java:260 src/plm/core/ui/MainFrame.java:686
 msgid "Revert Exercise"
 msgstr "Recommencer l'exercice"
 
-#: src/plm/core/ui/MainFrame.java:260 src/plm/core/ui/MainFrame.java:682
+#: src/plm/core/ui/MainFrame.java:263 src/plm/core/ui/MainFrame.java:687
 msgid "Export Session Cache"
 msgstr "Exporter le cache de session"
 
-#: src/plm/core/ui/MainFrame.java:263 src/plm/core/ui/MainFrame.java:683
+#: src/plm/core/ui/MainFrame.java:266 src/plm/core/ui/MainFrame.java:688
 msgid "Import Session Cache"
 msgstr "Importer le cache de session"
 
-#: src/plm/core/ui/MainFrame.java:268 src/plm/core/ui/MainFrame.java:684
+#: src/plm/core/ui/MainFrame.java:271 src/plm/core/ui/MainFrame.java:689
 msgid "Export Session Cache to Cloud"
 msgstr "Exporter la session dans le cloud"
 
-#: src/plm/core/ui/MainFrame.java:271 src/plm/core/ui/MainFrame.java:685
+#: src/plm/core/ui/MainFrame.java:274 src/plm/core/ui/MainFrame.java:690
 msgid "Import Session Cache from Cloud"
 msgstr "Importer la session depuis le cloud"
 
-#: src/plm/core/ui/MainFrame.java:277 src/plm/core/ui/MainFrame.java:687
+#: src/plm/core/ui/MainFrame.java:280 src/plm/core/ui/MainFrame.java:692
 msgid "Debug mode"
 msgstr "Mode débogage"
 
-#: src/plm/core/ui/MainFrame.java:288 src/plm/core/ui/MainFrame.java:688
+#: src/plm/core/ui/MainFrame.java:291 src/plm/core/ui/MainFrame.java:693
 msgid "Creative mode"
 msgstr "Mode créatif"
 
 #. === Language menu ===
-#: src/plm/core/ui/MainFrame.java:301 src/plm/core/ui/MainFrame.java:691
+#: src/plm/core/ui/MainFrame.java:304 src/plm/core/ui/MainFrame.java:696
 msgid "Language"
 msgstr "Langage"
 
 #. === Programming language changing ===
-#: src/plm/core/ui/MainFrame.java:306 src/plm/core/ui/MainFrame.java:692
+#: src/plm/core/ui/MainFrame.java:309 src/plm/core/ui/MainFrame.java:697
 msgid "Human"
 msgstr "Humain"
 
-#: src/plm/core/ui/MainFrame.java:320 src/plm/core/ui/MainFrame.java:693
+#: src/plm/core/ui/MainFrame.java:323 src/plm/core/ui/MainFrame.java:698
 msgid "Computer"
 msgstr "Ordinateur"
 
 #. === Help menu ===
-#: src/plm/core/ui/MainFrame.java:324 src/plm/core/ui/MainFrame.java:695
+#: src/plm/core/ui/MainFrame.java:327 src/plm/core/ui/MainFrame.java:700
 msgid "Help"
 msgstr "Aide"
 
-#: src/plm/core/ui/MainFrame.java:328 src/plm/core/ui/MainFrame.java:696
+#: src/plm/core/ui/MainFrame.java:331 src/plm/core/ui/MainFrame.java:701
 msgid "Provide feedback"
 msgstr "Rapport d'anomalie"
 
-#: src/plm/core/ui/MainFrame.java:338 src/plm/core/ui/MainFrame.java:697
+#: src/plm/core/ui/MainFrame.java:341 src/plm/core/ui/MainFrame.java:702
 msgid "About this lesson"
 msgstr "À propos de cette leçon"
 
-#: src/plm/core/ui/MainFrame.java:351 src/plm/core/ui/MainFrame.java:698
+#: src/plm/core/ui/MainFrame.java:354 src/plm/core/ui/MainFrame.java:703
 msgid "About this world"
 msgstr "À propos de ce monde"
 
-#: src/plm/core/ui/MainFrame.java:367 src/plm/core/ui/MainFrame.java:700
+#: src/plm/core/ui/MainFrame.java:370 src/plm/core/ui/MainFrame.java:705
 msgid "About PLM"
 msgstr "À propos de PLM"
 
 #. Buttons
-#: src/plm/core/ui/MainFrame.java:400 src/plm/core/ui/MainFrame.java:661
+#: src/plm/core/ui/MainFrame.java:403 src/plm/core/ui/MainFrame.java:666
 msgid "Run"
 msgstr "Exécuter"
 
-#: src/plm/core/ui/MainFrame.java:404 src/plm/core/ui/MainFrame.java:502
-#: src/plm/core/ui/MainFrame.java:662
+#: src/plm/core/ui/MainFrame.java:407 src/plm/core/ui/MainFrame.java:507
+#: src/plm/core/ui/MainFrame.java:667
 msgid "Step"
 msgstr "Un pas"
 
-#: src/plm/core/ui/MainFrame.java:409 src/plm/core/ui/MainFrame.java:663
+#: src/plm/core/ui/MainFrame.java:412 src/plm/core/ui/MainFrame.java:668
 msgid "Stop"
 msgstr "Stop"
 
-#: src/plm/core/ui/MainFrame.java:415 src/plm/core/ui/MainFrame.java:664
+#: src/plm/core/ui/MainFrame.java:418 src/plm/core/ui/MainFrame.java:669
 msgid "Reset"
 msgstr "Réinitialiser"
 
-#: src/plm/core/ui/MainFrame.java:421 src/plm/core/ui/MainFrame.java:665
+#: src/plm/core/ui/MainFrame.java:424 src/plm/core/ui/MainFrame.java:670
 msgid "Demo"
 msgstr "Démo"
 
-#: src/plm/core/ui/MainFrame.java:427 src/plm/core/ui/MainFrame.java:666
+#: src/plm/core/ui/MainFrame.java:430 src/plm/core/ui/MainFrame.java:671
 #: src/plm/core/ui/action/HelpMe.java:37
 msgid "Call for Help"
 msgstr "Appeler à l'aide"
 
-#: src/plm/core/ui/MainFrame.java:487
+#: src/plm/core/ui/MainFrame.java:492
 msgid "Next"
 msgstr "Suivant"
 
-#: src/plm/core/ui/MainFrame.java:680
+#: src/plm/core/ui/MainFrame.java:685
 msgid "Lesson related functions"
 msgstr "Fonctions relatives aux leçons"
 
@@ -1216,23 +1217,23 @@ msgstr "Composer votre code ici"
 msgid "<img> tag without src attribute in exercise {0}"
 msgstr "Tag <img> sans attribut src dans l''exercice {0}."
 
-#: src/plm/core/ui/StatusBar.java:113
+#: src/plm/core/ui/StatusBar.java:117
 msgid "Saving"
 msgstr "Sauvegarde"
 
-#: src/plm/core/ui/StatusBar.java:117
+#: src/plm/core/ui/StatusBar.java:122
 msgid "Compiling"
 msgstr "Compilation"
 
-#: src/plm/core/ui/StatusBar.java:131
+#: src/plm/core/ui/StatusBar.java:138
 msgid "Running "
 msgstr "Exécution de "
 
-#: src/plm/core/ui/StatusBar.java:135
+#: src/plm/core/ui/StatusBar.java:143
 msgid "Playing demo "
 msgstr "Exécution de la démo "
 
-#: src/plm/core/ui/StatusBar.java:139
+#: src/plm/core/ui/StatusBar.java:148
 msgid "Loading "
 msgstr "Chargement de "
 
@@ -1259,7 +1260,7 @@ msgstr ""
 msgid "Export success"
 msgstr "Export réussi"
 
-#: src/plm/core/ui/action/ExportCloudSession.java:131
+#: src/plm/core/ui/action/ExportCloudSession.java:132
 #, java-format
 msgid ""
 "<html>Export to cloud failed.<br/>{0}<br/>Caution! Your session is not saved "
@@ -1268,7 +1269,7 @@ msgstr ""
 "<html>L''export de votre session dans le cloud a échoué.<br/>{0}<br/"
 ">Attention! Votre session n''est pas encore sauvegardée.</html>"
 
-#: src/plm/core/ui/action/ExportCloudSession.java:132
+#: src/plm/core/ui/action/ExportCloudSession.java:133
 msgid "Export error"
 msgstr "Erreur d'export"
 
@@ -1276,28 +1277,36 @@ msgstr "Erreur d'export"
 msgid "Cancel call"
 msgstr "Annuler l'appel"
 
-#: src/plm/core/ui/action/ImportCloudSession.java:131
+#: src/plm/core/ui/action/ImportCloudSession.java:84
+msgid "Download failed - Please check the code you entered."
+msgstr "Erreur de téléchargement. Veuillez vérifier le code fourni."
+
+#: src/plm/core/ui/action/ImportCloudSession.java:133
 msgid "Please enter your personal code to retrieve your session"
 msgstr "Veuillez entrer votre code personnel pour sauvegarder la session"
 
-#: src/plm/core/ui/action/ImportCloudSession.java:132
+#: src/plm/core/ui/action/ImportCloudSession.java:134
 msgid "Session code"
 msgstr "Code de la session"
 
-#: src/plm/core/ui/action/ImportCloudSession.java:150
+#: src/plm/core/ui/action/ImportCloudSession.java:153
 msgid "Your session has been successfully imported."
 msgstr "Votre session a été importée avec succès."
 
-#: src/plm/core/ui/action/ImportCloudSession.java:151
+#: src/plm/core/ui/action/ImportCloudSession.java:154
 msgid "Importation suceeded"
 msgstr "Import réussi"
 
-#: src/plm/core/ui/action/ImportCloudSession.java:155
+#: src/plm/core/ui/action/ImportCloudSession.java:156
+msgid "Something unexpected went wrong during downloading"
+msgstr "Une erreur inattendue s'est produite pendant le téléchargement."
+
+#: src/plm/core/ui/action/ImportCloudSession.java:161
 #, java-format
 msgid "A {0} exception occured while importing your session: {1}"
 msgstr "Une exception {0} s''est produite lors de l''import de la session: {1}"
 
-#: src/plm/core/ui/action/ImportCloudSession.java:156
+#: src/plm/core/ui/action/ImportCloudSession.java:162
 msgid "Importation error"
 msgstr "Erreur d'import"
 
@@ -1764,17 +1773,17 @@ msgstr ""
 "Erreur de syntaxe. J''attendais la description d''une cellule ou d''un "
 "buggle mais j''ai eu : {0}"
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:542
+#: src/plm/universe/bugglequest/BuggleWorld.java:551
 #, java-format
 msgid "  The world''s name is {0}"
 msgstr "  Le nom du monde est {0}"
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:546
+#: src/plm/universe/bugglequest/BuggleWorld.java:555
 #, java-format
 msgid "  In ({0},{1})"
 msgstr "  En ({0},{1})"
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:549
+#: src/plm/universe/bugglequest/BuggleWorld.java:558
 #, java-format
 msgid "  Something is wrong about buggle ''{0}'':\n"
 msgstr "  Il y a quelque chose qui cloche avec la buggle «{0}»:\n"
@@ -1935,3 +1944,79 @@ msgstr "setValeur"
 #: src/plm/universe/sort/SortingButtonPanel.java:108
 msgid "copy"
 msgstr "copie"
+
+#: src/plm/universe/sort/SortingWorld.java:115
+#, java-format
+msgid ""
+"This is very weird: There is not the same amount of values! Expected: {0}; "
+"Found: {1}\n"
+msgstr ""
+"C''est très bizarre. Il n''y a pas le même nombre de valeurs! J''en "
+"attendais {0}, mais j''en ai {1}.\n"
+
+#: src/plm/universe/sort/SortingWorld.java:118
+#, java-format
+msgid "Invalid read count. Expected: {0}; Found: {1}\n"
+msgstr "Le nombre de lectures diffère. Attendu : {0}; Observé : {1}\n"
+
+#: src/plm/universe/sort/SortingWorld.java:121
+#, java-format
+msgid "Invalid write count. Expected: {0}; Found: {1}\n"
+msgstr "Le nombre d''écritures diffère. Attendu : {0}; Observé : {1}\n"
+
+#: src/plm/universe/sort/SortingWorld.java:125
+#, java-format
+msgid "Value at index {0} differs. Expected {1}; Found {2}\n"
+msgstr "Les valeurs à l''index {0} diffère. Attendue : {1}; Observée : {2}\n"
+
+#: src/plm/universe/sort/SortingWorld.java:351
+#: src/plm/universe/sort/SortingWorld.java:352
+#, java-format
+msgid "Out of bounds in swap({0},{1}): {2}<0"
+msgstr "Dépassement des bornes à l''appel de  echange({0},{1}) : {2}<0"
+
+#: src/plm/universe/sort/SortingWorld.java:353
+#: src/plm/universe/sort/SortingWorld.java:354
+#, java-format
+msgid "Out of bounds in swap({0},{1}): {2}>value count"
+msgstr ""
+"Dépassement des bornes à l''appel de la méthode echange({0},{1}) : {2}"
+">nombre de valeurs"
+
+#: src/plm/universe/turtles/Line.java:75
+msgid "x1 differs."
+msgstr "x1 diffère."
+
+#: src/plm/universe/turtles/Line.java:77
+msgid "x2 differs."
+msgstr "x2 diffère."
+
+#: src/plm/universe/turtles/Line.java:79
+msgid "y1 differs."
+msgstr "y1 diffère."
+
+#: src/plm/universe/turtles/Line.java:81
+msgid "y2 differs."
+msgstr "y2 diffère."
+
+#: src/plm/universe/turtles/Line.java:83
+msgid "The color differs."
+msgstr "La couleur diffère."
+
+#: src/plm/universe/turtles/Line.java:84
+msgid "I dont see the difference (please report this bug)."
+msgstr "Je ne vois pas de différence (merci de rapporter cette anomalie)."
+
+#: src/plm/universe/turtles/Line.java:86
+msgid "That's not a line."
+msgstr "Ce n'est pas une ligne."
+
+#: src/plm/universe/turtles/TurtleWorld.java:235
+#, java-format
+msgid "  There is only {0} shapes where {1} shapes were expected\n"
+msgstr "  Il n''y a que {0} formes là où {1} formes étaient attendues\n"
+
+#: src/plm/universe/turtles/TurtleWorld.java:238
+#, java-format
+msgid "  {0} (got {1} instead of {2})\n"
+msgstr "  {0} (trouvé {1} au lieu de {2})\n"
diff --git a/lib/l10n-engine/plm.pot b/lib/l10n-engine/plm.pot
index 77b9b9f..61a379d 100644
--- a/lib/l10n-engine/plm.pot
+++ b/lib/l10n-engine/plm.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-12 21:46+0200\n"
+"POT-Creation-Date: 2013-09-24 01:33+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -702,7 +702,8 @@ msgstr ""
 msgid "Close"
 msgstr ""
 
-#: src/plm/core/ui/AboutWorldDialog.java:32
+#: src/plm/core/ui/AboutWorldDialog.java:31
+#: src/plm/core/ui/AboutWorldDialog.java:50
 #, java-format
 msgid "About world - {0}"
 msgstr ""
@@ -727,12 +728,12 @@ msgid ""
 msgstr ""
 
 #: src/plm/core/ui/ChooseLessonDialog.java:132
-#: src/plm/core/ui/MainFrame.java:165
+#: src/plm/core/ui/MainFrame.java:168
 msgid "PLM lesson files"
 msgstr ""
 
 #: src/plm/core/ui/ChooseLessonDialog.java:141
-#: src/plm/core/ui/MainFrame.java:174
+#: src/plm/core/ui/MainFrame.java:177
 msgid "Error"
 msgstr ""
 
@@ -890,140 +891,140 @@ msgstr ""
 #. === FILE menu ===
 #. for now: leave the calls to i18n.tr: that way one is sure to get all the localized strings...
 #. Menus
-#: src/plm/core/ui/MainFrame.java:154 src/plm/core/ui/MainFrame.java:670
+#: src/plm/core/ui/MainFrame.java:157 src/plm/core/ui/MainFrame.java:675
 msgid "File"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:156
+#: src/plm/core/ui/MainFrame.java:159
 msgid "File related functions"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:159 src/plm/core/ui/MainFrame.java:671
+#: src/plm/core/ui/MainFrame.java:162 src/plm/core/ui/MainFrame.java:676
 msgid "Load lesson"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:181 src/plm/core/ui/MainFrame.java:672
+#: src/plm/core/ui/MainFrame.java:184 src/plm/core/ui/MainFrame.java:677
 msgid "Switch lesson"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:193 src/plm/core/ui/MainFrame.java:439
-#: src/plm/core/ui/MainFrame.java:667 src/plm/core/ui/MainFrame.java:673
+#: src/plm/core/ui/MainFrame.java:196 src/plm/core/ui/MainFrame.java:444
+#: src/plm/core/ui/MainFrame.java:672 src/plm/core/ui/MainFrame.java:678
 msgid "Switch exercise"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:206 src/plm/core/ui/MainFrame.java:675
+#: src/plm/core/ui/MainFrame.java:209 src/plm/core/ui/MainFrame.java:680
 msgid "Teacher Console"
 msgstr ""
 
 #. Menu item to change the current Course
-#: src/plm/core/ui/MainFrame.java:225 src/plm/core/ui/MainFrame.java:676
+#: src/plm/core/ui/MainFrame.java:228 src/plm/core/ui/MainFrame.java:681
 msgid "Choose your course"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:244 src/plm/core/ui/MainFrame.java:677
+#: src/plm/core/ui/MainFrame.java:247 src/plm/core/ui/MainFrame.java:682
 msgid "Quit"
 msgstr ""
 
 #. === Edit menu ===
-#: src/plm/core/ui/MainFrame.java:252 src/plm/core/ui/MainFrame.java:679
+#: src/plm/core/ui/MainFrame.java:255 src/plm/core/ui/MainFrame.java:684
 msgid "Session"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:257 src/plm/core/ui/MainFrame.java:681
+#: src/plm/core/ui/MainFrame.java:260 src/plm/core/ui/MainFrame.java:686
 msgid "Revert Exercise"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:260 src/plm/core/ui/MainFrame.java:682
+#: src/plm/core/ui/MainFrame.java:263 src/plm/core/ui/MainFrame.java:687
 msgid "Export Session Cache"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:263 src/plm/core/ui/MainFrame.java:683
+#: src/plm/core/ui/MainFrame.java:266 src/plm/core/ui/MainFrame.java:688
 msgid "Import Session Cache"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:268 src/plm/core/ui/MainFrame.java:684
+#: src/plm/core/ui/MainFrame.java:271 src/plm/core/ui/MainFrame.java:689
 msgid "Export Session Cache to Cloud"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:271 src/plm/core/ui/MainFrame.java:685
+#: src/plm/core/ui/MainFrame.java:274 src/plm/core/ui/MainFrame.java:690
 msgid "Import Session Cache from Cloud"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:277 src/plm/core/ui/MainFrame.java:687
+#: src/plm/core/ui/MainFrame.java:280 src/plm/core/ui/MainFrame.java:692
 msgid "Debug mode"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:288 src/plm/core/ui/MainFrame.java:688
+#: src/plm/core/ui/MainFrame.java:291 src/plm/core/ui/MainFrame.java:693
 msgid "Creative mode"
 msgstr ""
 
 #. === Language menu ===
-#: src/plm/core/ui/MainFrame.java:301 src/plm/core/ui/MainFrame.java:691
+#: src/plm/core/ui/MainFrame.java:304 src/plm/core/ui/MainFrame.java:696
 msgid "Language"
 msgstr ""
 
 #. === Programming language changing ===
-#: src/plm/core/ui/MainFrame.java:306 src/plm/core/ui/MainFrame.java:692
+#: src/plm/core/ui/MainFrame.java:309 src/plm/core/ui/MainFrame.java:697
 msgid "Human"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:320 src/plm/core/ui/MainFrame.java:693
+#: src/plm/core/ui/MainFrame.java:323 src/plm/core/ui/MainFrame.java:698
 msgid "Computer"
 msgstr ""
 
 #. === Help menu ===
-#: src/plm/core/ui/MainFrame.java:324 src/plm/core/ui/MainFrame.java:695
+#: src/plm/core/ui/MainFrame.java:327 src/plm/core/ui/MainFrame.java:700
 msgid "Help"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:328 src/plm/core/ui/MainFrame.java:696
+#: src/plm/core/ui/MainFrame.java:331 src/plm/core/ui/MainFrame.java:701
 msgid "Provide feedback"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:338 src/plm/core/ui/MainFrame.java:697
+#: src/plm/core/ui/MainFrame.java:341 src/plm/core/ui/MainFrame.java:702
 msgid "About this lesson"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:351 src/plm/core/ui/MainFrame.java:698
+#: src/plm/core/ui/MainFrame.java:354 src/plm/core/ui/MainFrame.java:703
 msgid "About this world"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:367 src/plm/core/ui/MainFrame.java:700
+#: src/plm/core/ui/MainFrame.java:370 src/plm/core/ui/MainFrame.java:705
 msgid "About PLM"
 msgstr ""
 
 #. Buttons
-#: src/plm/core/ui/MainFrame.java:400 src/plm/core/ui/MainFrame.java:661
+#: src/plm/core/ui/MainFrame.java:403 src/plm/core/ui/MainFrame.java:666
 msgid "Run"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:404 src/plm/core/ui/MainFrame.java:502
-#: src/plm/core/ui/MainFrame.java:662
+#: src/plm/core/ui/MainFrame.java:407 src/plm/core/ui/MainFrame.java:507
+#: src/plm/core/ui/MainFrame.java:667
 msgid "Step"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:409 src/plm/core/ui/MainFrame.java:663
+#: src/plm/core/ui/MainFrame.java:412 src/plm/core/ui/MainFrame.java:668
 msgid "Stop"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:415 src/plm/core/ui/MainFrame.java:664
+#: src/plm/core/ui/MainFrame.java:418 src/plm/core/ui/MainFrame.java:669
 msgid "Reset"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:421 src/plm/core/ui/MainFrame.java:665
+#: src/plm/core/ui/MainFrame.java:424 src/plm/core/ui/MainFrame.java:670
 msgid "Demo"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:427 src/plm/core/ui/MainFrame.java:666
+#: src/plm/core/ui/MainFrame.java:430 src/plm/core/ui/MainFrame.java:671
 #: src/plm/core/ui/action/HelpMe.java:37
 msgid "Call for Help"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:487
+#: src/plm/core/ui/MainFrame.java:492
 msgid "Next"
 msgstr ""
 
-#: src/plm/core/ui/MainFrame.java:680
+#: src/plm/core/ui/MainFrame.java:685
 msgid "Lesson related functions"
 msgstr ""
 
@@ -1045,23 +1046,23 @@ msgstr ""
 msgid "<img> tag without src attribute in exercise {0}"
 msgstr ""
 
-#: src/plm/core/ui/StatusBar.java:113
+#: src/plm/core/ui/StatusBar.java:117
 msgid "Saving"
 msgstr ""
 
-#: src/plm/core/ui/StatusBar.java:117
+#: src/plm/core/ui/StatusBar.java:122
 msgid "Compiling"
 msgstr ""
 
-#: src/plm/core/ui/StatusBar.java:131
+#: src/plm/core/ui/StatusBar.java:138
 msgid "Running "
 msgstr ""
 
-#: src/plm/core/ui/StatusBar.java:135
+#: src/plm/core/ui/StatusBar.java:143
 msgid "Playing demo "
 msgstr ""
 
-#: src/plm/core/ui/StatusBar.java:139
+#: src/plm/core/ui/StatusBar.java:148
 msgid "Loading "
 msgstr ""
 
@@ -1084,14 +1085,14 @@ msgstr ""
 msgid "Export success"
 msgstr ""
 
-#: src/plm/core/ui/action/ExportCloudSession.java:131
+#: src/plm/core/ui/action/ExportCloudSession.java:132
 #, java-format
 msgid ""
 "<html>Export to cloud failed.<br/>{0}<br/>Caution! Your session is not saved "
 "yet.</html>"
 msgstr ""
 
-#: src/plm/core/ui/action/ExportCloudSession.java:132
+#: src/plm/core/ui/action/ExportCloudSession.java:133
 msgid "Export error"
 msgstr ""
 
@@ -1099,28 +1100,36 @@ msgstr ""
 msgid "Cancel call"
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:131
+#: src/plm/core/ui/action/ImportCloudSession.java:84
+msgid "Download failed - Please check the code you entered."
+msgstr ""
+
+#: src/plm/core/ui/action/ImportCloudSession.java:133
 msgid "Please enter your personal code to retrieve your session"
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:132
+#: src/plm/core/ui/action/ImportCloudSession.java:134
 msgid "Session code"
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:150
+#: src/plm/core/ui/action/ImportCloudSession.java:153
 msgid "Your session has been successfully imported."
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:151
+#: src/plm/core/ui/action/ImportCloudSession.java:154
 msgid "Importation suceeded"
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:155
+#: src/plm/core/ui/action/ImportCloudSession.java:156
+msgid "Something unexpected went wrong during downloading"
+msgstr ""
+
+#: src/plm/core/ui/action/ImportCloudSession.java:161
 #, java-format
 msgid "A {0} exception occured while importing your session: {1}"
 msgstr ""
 
-#: src/plm/core/ui/action/ImportCloudSession.java:156
+#: src/plm/core/ui/action/ImportCloudSession.java:162
 msgid "Importation error"
 msgstr ""
 
@@ -1534,17 +1543,17 @@ msgid ""
 "Parse error. I was expecting a cell or a buggle description but got: {0}"
 msgstr ""
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:542
+#: src/plm/universe/bugglequest/BuggleWorld.java:551
 #, java-format
 msgid "  The world''s name is {0}"
 msgstr ""
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:546
+#: src/plm/universe/bugglequest/BuggleWorld.java:555
 #, java-format
 msgid "  In ({0},{1})"
 msgstr ""
 
-#: src/plm/universe/bugglequest/BuggleWorld.java:549
+#: src/plm/universe/bugglequest/BuggleWorld.java:558
 #, java-format
 msgid "  Something is wrong about buggle ''{0}'':\n"
 msgstr ""
@@ -1705,3 +1714,75 @@ msgstr ""
 #: src/plm/universe/sort/SortingButtonPanel.java:108
 msgid "copy"
 msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:115
+#, java-format
+msgid ""
+"This is very weird: There is not the same amount of values! Expected: {0}; "
+"Found: {1}\n"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:118
+#, java-format
+msgid "Invalid read count. Expected: {0}; Found: {1}\n"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:121
+#, java-format
+msgid "Invalid write count. Expected: {0}; Found: {1}\n"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:125
+#, java-format
+msgid "Value at index {0} differs. Expected {1}; Found {2}\n"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:351
+#: src/plm/universe/sort/SortingWorld.java:352
+#, java-format
+msgid "Out of bounds in swap({0},{1}): {2}<0"
+msgstr ""
+
+#: src/plm/universe/sort/SortingWorld.java:353
+#: src/plm/universe/sort/SortingWorld.java:354
+#, java-format
+msgid "Out of bounds in swap({0},{1}): {2}>value count"
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:75
+msgid "x1 differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:77
+msgid "x2 differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:79
+msgid "y1 differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:81
+msgid "y2 differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:83
+msgid "The color differs."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:84
+msgid "I dont see the difference (please report this bug)."
+msgstr ""
+
+#: src/plm/universe/turtles/Line.java:86
+msgid "That's not a line."
+msgstr ""
+
+#: src/plm/universe/turtles/TurtleWorld.java:235
+#, java-format
+msgid "  There is only {0} shapes where {1} shapes were expected\n"
+msgstr ""
+
+#: src/plm/universe/turtles/TurtleWorld.java:238
+#, java-format
+msgid "  {0} (got {1} instead of {2})\n"
+msgstr ""
diff --git a/lib/l10n/fr.po b/lib/l10n/fr.po
index 668089b..3e90c26 100644
--- a/lib/l10n/fr.po
+++ b/lib/l10n/fr.po
@@ -6,8 +6,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PLM mission texts\n"
-"POT-Creation-Date: 2013-09-12 21:41+0300\n"
-"PO-Revision-Date: 2013-09-12 21:42+0200\n"
+"POT-Creation-Date: 2013-09-30 12:10+0300\n"
+"PO-Revision-Date: 2013-09-30 12:11+0200\n"
 "Last-Translator: Martin Quinson\n"
 "Language-Team: none\n"
 "Language: French\n"
@@ -492,7 +492,7 @@ msgstr ""
 
 #. type: Content of: <p>
 #: src/plm/universe/sort/SortingWorld.html:47
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:18
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:18
 msgid ""
 "The history view is a bit hairly at the first glance, but actually rather "
 "simple: The time flows from left to right on this graph, and each row is a "
@@ -507,7 +507,7 @@ msgstr ""
 "première vue. Le temps s'écoule de gauche à droite, et les cases du tableau "
 "sont représentée de haut en bas. Les lignes de différentes couleurs qui "
 "serpentent représentent les différentes valeurs contenues dans le tableau. "
-"Quand deux lignes se croises, cela signifie que les valeurs du tableau ont "
+"Quand deux lignes se croisent, cela signifie que les valeurs du tableau ont "
 "été échangées à ce moment de l'historique; un embranchement signifie que la "
 "valeur a été copiée; une valeur en violet suivie d'un point d'interrogation "
 "a été lue avec getValeur() et une valeur en rouge suivie d'un point "
@@ -716,9 +716,8 @@ msgstr "[!java]boolean [/!]estCrayonBaisse()[!scala]:Boolean[/!]"
 msgid "Returns the current pen position as a boolean."
 msgstr "Retourne si le stylo est actuellement baissé ou non."
 
-#. type: Content of: <table><tr><td>
+#. type: Content of: <pre>
 #: src/plm/universe/turtles/TurtleWorld.html:57
-#: src/plm/universe/bugglequest/BuggleWorld.html:25
 #, no-wrap
 msgid "[!java]Color [/!]getColor()[!scala]:Color[/!]"
 msgstr "[!java]Color [/!]getCouleur()[!scala]:Color[/!]"
@@ -759,6 +758,137 @@ msgid ""
 msgstr ""
 "Renvoie si la tortue actuelle est sélectionnée dans l'interface graphique."
 
+#. type: Content of: <h2>
+#: src/plm/universe/turtles/TurtleWorld.html:68
+#: src/plm/universe/bugglequest/BuggleWorld.html:65
+msgid "Valid colors"
+msgstr "Couleurs valides"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:70
+#: src/plm/universe/bugglequest/BuggleWorld.html:67
+msgid "Name"
+msgstr "Nom"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:70
+#: src/plm/universe/bugglequest/BuggleWorld.html:67
+msgid "Color"
+msgstr "Couleur"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:71
+#: src/plm/universe/bugglequest/BuggleWorld.html:68
+msgid "Color.black"
+msgstr "Color.black"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:71
+#: src/plm/universe/turtles/TurtleWorld.html:72
+#: src/plm/universe/turtles/TurtleWorld.html:73
+#: src/plm/universe/turtles/TurtleWorld.html:74
+#: src/plm/universe/turtles/TurtleWorld.html:75
+#: src/plm/universe/turtles/TurtleWorld.html:76
+#: src/plm/universe/turtles/TurtleWorld.html:77
+#: src/plm/universe/turtles/TurtleWorld.html:78
+#: src/plm/universe/turtles/TurtleWorld.html:79
+#: src/plm/universe/turtles/TurtleWorld.html:80
+#: src/plm/universe/turtles/TurtleWorld.html:81
+#: src/plm/universe/turtles/TurtleWorld.html:82
+#: src/plm/universe/turtles/TurtleWorld.html:83
+#: src/plm/universe/bugglequest/BuggleWorld.html:56
+#: src/plm/universe/bugglequest/BuggleWorld.html:68
+#: src/plm/universe/bugglequest/BuggleWorld.html:69
+#: src/plm/universe/bugglequest/BuggleWorld.html:70
+#: src/plm/universe/bugglequest/BuggleWorld.html:71
+#: src/plm/universe/bugglequest/BuggleWorld.html:72
+#: src/plm/universe/bugglequest/BuggleWorld.html:73
+#: src/plm/universe/bugglequest/BuggleWorld.html:74
+#: src/plm/universe/bugglequest/BuggleWorld.html:75
+#: src/plm/universe/bugglequest/BuggleWorld.html:76
+#: src/plm/universe/bugglequest/BuggleWorld.html:77
+#: src/plm/universe/bugglequest/BuggleWorld.html:78
+#: src/plm/universe/bugglequest/BuggleWorld.html:79
+#: src/plm/universe/bugglequest/BuggleWorld.html:80
+#: src/lessons/welcome/Main.html:8 src/lessons/welcome/Main.html:91
+#: src/lessons/welcome/Main.html:174 src/lessons/welcome/Main.html:254
+#: src/lessons/welcome/Main.html:348 src/lessons/welcome/Main.html:428
+#: src/lessons/welcome/Main.html:468
+msgid " "
+msgstr " "
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:72
+#: src/plm/universe/bugglequest/BuggleWorld.html:69
+msgid "Color.blue"
+msgstr "Color.blue"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:73
+#: src/plm/universe/bugglequest/BuggleWorld.html:70
+msgid "Color.cyan"
+msgstr "Color.cyan"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:74
+#: src/plm/universe/bugglequest/BuggleWorld.html:71
+msgid "Color.darkGray"
+msgstr "Color.darkGray"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:75
+#: src/plm/universe/bugglequest/BuggleWorld.html:72
+msgid "Color.gray"
+msgstr "Color.gray"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:76
+#: src/plm/universe/bugglequest/BuggleWorld.html:73
+msgid "Color.green"
+msgstr "Color.green"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:77
+#: src/plm/universe/bugglequest/BuggleWorld.html:74
+msgid "Color.lightGray"
+msgstr "Color.lightGray"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:78
+#: src/plm/universe/bugglequest/BuggleWorld.html:75
+msgid "Color.magenta"
+msgstr "Color.magenta"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:79
+#: src/plm/universe/bugglequest/BuggleWorld.html:76
+msgid "Color.orange"
+msgstr "Color.orange"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:80
+#: src/plm/universe/bugglequest/BuggleWorld.html:77
+msgid "Color.pink"
+msgstr "Color.pink"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:81
+#: src/plm/universe/bugglequest/BuggleWorld.html:78
+msgid "Color.red"
+msgstr "Color.red"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:82
+#: src/plm/universe/bugglequest/BuggleWorld.html:79
+msgid "Color.white"
+msgstr "Color.white"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:83
+#: src/plm/universe/bugglequest/BuggleWorld.html:80
+msgid "Color.yellow"
+msgstr "Color.yellow"
+
 #. type: Content of: <h1>
 #: src/plm/universe/bugglequest/BuggleWorld.html:1
 msgid "BuggleWorld"
@@ -921,18 +1051,23 @@ msgstr "<b>Informations sur la buggle</b>"
 
 #. type: Content of: <table><tr><td><b>
 #: src/plm/universe/bugglequest/BuggleWorld.html:24
-msgid "<b>Get the color"
-msgstr "<b>Obtenir la couleur"
+msgid "<b>Get the color of the body"
+msgstr "<b>Obtenir la couleur de la buggle</b>"
 
 #. type: Content of: <table><tr><td>
 #: src/plm/universe/bugglequest/BuggleWorld.html:24
-msgid "Set the color</b>"
-msgstr "Changer la couleur</b>"
+msgid "Set the color of the body</b>"
+msgstr "Changer la couleur de la buggle</b>"
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/bugglequest/BuggleWorld.html:25
+msgid "[!java]Color [/!]getBodyColor()[!scala]:Color[/!]"
+msgstr "[!java]Color [/!]getCouleurCorps()[!scala]:Color[/!]"
 
 #. type: Content of: <table><tr><td>
 #: src/plm/universe/bugglequest/BuggleWorld.html:26
-msgid "[!java]void [/!]setColor([!java]Color [/!]c[!scala]:Color[/!])"
-msgstr "[!java]void [/!]setCouleur([!java]Color [/!]c[!scala]:Color[/!])"
+msgid "[!java]void [/!]setBodyColor([!java]Color [/!]c[!scala]:Color[/!])"
+msgstr "[!java]void [/!]setCouleurCorps([!java]Color [/!]c[!scala]:Color[/!])"
 
 #. type: Content of: <table><tr><td><b>
 #: src/plm/universe/bugglequest/BuggleWorld.html:27
@@ -1111,15 +1246,6 @@ msgstr "[!java]void [/!]prendBiscuit()"
 msgid "[!java]void [/!]dropBaggle()"
 msgstr "[!java]void [/!]poseBiscuit()"
 
-#. type: Content of: <table><tr><td>
-#: src/plm/universe/bugglequest/BuggleWorld.html:56
-#: src/lessons/welcome/Main.html:8 src/lessons/welcome/Main.html:91
-#: src/lessons/welcome/Main.html:174 src/lessons/welcome/Main.html:254
-#: src/lessons/welcome/Main.html:348 src/lessons/welcome/Main.html:428
-#: src/lessons/welcome/Main.html:468
-msgid " "
-msgstr " "
-
 #. type: Content of: <table><tr><td><b>
 #: src/plm/universe/bugglequest/BuggleWorld.html:58
 msgid "<b>Look for a message"
@@ -1161,12 +1287,12 @@ msgid "[!java]void [/!]clearMessage()"
 msgstr "[!java]void [/!]effaceMessage()"
 
 #. type: Content of: <h2>
-#: src/plm/universe/bugglequest/BuggleWorld.html:65
+#: src/plm/universe/bugglequest/BuggleWorld.html:83
 msgid "Note on exceptions"
 msgstr "Note sur les exceptions"
 
 #. type: Content of: outside any tag (error?)
-#: src/plm/universe/bugglequest/BuggleWorld.html:66
+#: src/plm/universe/bugglequest/BuggleWorld.html:84
 msgid ""
 "Regular buggles throw a BuggleWallException exception if you ask them to "
 "traverse a wall.  They throw a NoBaggleUnderBuggleException exception if you "
@@ -1187,7 +1313,7 @@ msgstr ""
 "DontHaveBaggleException."
 
 #. type: Content of: <p>
-#: src/plm/universe/bugglequest/BuggleWorld.html:73
+#: src/plm/universe/bugglequest/BuggleWorld.html:91
 msgid ""
 "SimpleBuggles (ie, the one used in first exercises) display an error message "
 "on problem so that you don't need to know what an exception is."
@@ -2113,7 +2239,7 @@ msgstr "casserLesOeufs(); ajouterDuSel(); melangerLeTout(); faireCuire();\n"
 #: src/lessons/welcome/bdr/BDR2.html:129
 #: src/lessons/turmites/langton/Langton.html:31
 #: src/lessons/turmites/helloturmite/HelloTurmite.html:64
-#: src/lessons/sort/comb/AlgCombSort.html:34
+#: src/lessons/sort/basic/comb/AlgCombSort.html:38
 #: src/lessons/recursion/square/FourSquare.html:45
 #: src/lessons/welcome/bat/bool1/Max1020.html:5
 #: src/lessons/welcome/array/basics/Array1.html:181
@@ -3119,8 +3245,8 @@ msgstr ""
 "Comme vous pouvez le voir, les variables sont <b>typées</b> en [!thelang]. "
 "Cela veut dire qu'elles sont en quelque sorte spécialisées: une variable "
 "donnée ne peut stocker qu'un type de données spécifique. N'essayez même pas "
-"de ranger des nombres dans une variable faite pour recevoir des lettres ! \n"
-"On dit que [!thelang] est un langage <b>typé statiquement</b>.\n"
+"de ranger des nombres dans une variable faite pour recevoir des lettres ! On "
+"dit que [!thelang] est un langage <b>typé statiquement</b>."
 
 #. type: Content of: <p><p><p>
 #: src/lessons/welcome/variables/Variables.html:57
@@ -3185,7 +3311,7 @@ msgstr ""
 "données particulier. Il est tout à fait envisageable de stocker des nombres "
 "dans une variable, puis d'y mettre des lettres un peu plus tard. Les valeurs "
 "elles-mêmes ont bien entendu un type, mais pas les variables. On dit alors "
-"que python est un langage <b>dynamiquement typé</b>.\n"
+"que python est un langage <b>dynamiquement typé</b>."
 
 #. type: Content of: <p><p><p>
 #: src/lessons/welcome/variables/Variables.html:74
@@ -3417,7 +3543,12 @@ msgid ""
 "<code>doneSteps</code> is not equal to <code>stepAmount</code>, incrementing "
 "<code>doneSteps</code> each time. The <code>!=</code> operator should be "
 "used to test the inequality (whether some values are NOT equal)."
-msgstr "Ensuite, l'étape 3 consiste simplement à créer une nouvelle variable entière <code>dejaFait</code> initialisée à zéro, et reculer d'un pas tant que <code>dejaFait</code> n'est pas égal à <code>nbPas</code>, en incrémentant <code>dejaFait</code> à chaque fois. Il faut utiliser l'opérateur <code>!=</code> pour tester l'inégalité entre deux valeurs."
+msgstr ""
+"Ensuite, l'étape 3 consiste simplement à créer une nouvelle variable entière "
+"<code>dejaFait</code> initialisée à zéro, et reculer d'un pas tant que "
+"<code>dejaFait</code> n'est pas égal à <code>nbPas</code>, en incrémentant "
+"<code>dejaFait</code> à chaque fois. Il faut utiliser l'opérateur <code>!=</"
+"code> pour tester l'inégalité entre deux valeurs."
 
 #. type: Content of: <p><p><p>
 #: src/lessons/welcome/variables/Variables.html:155
@@ -7660,12 +7791,12 @@ msgstr ""
 "quelques méthodes que vous serez amenés à utiliser."
 
 #. type: Content of: <h3>
-#: src/lessons/sort/Main.html:1 src/lessons/sort/short_desc.html:1
+#: src/lessons/sort/basic/Main.html:1 src/lessons/sort/basic/short_desc.html:1
 msgid "Sorting Algorithms"
 msgstr "Algorithmes de tri"
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/sort/Main.html:3
+#: src/lessons/sort/basic/Main.html:3
 msgid ""
 "This lesson allows to experiment with some classical sorting algorithms (and "
 "some less common variant of them). The goal is two fold: you can first "
@@ -7683,7 +7814,7 @@ msgstr ""
 "qu'implique la différence de complexité asymptotique entre deux algorithmes."
 
 #. type: Content of: <p>
-#: src/lessons/sort/Main.html:10
+#: src/lessons/sort/basic/Main.html:10
 msgid ""
 "More exercises are planned for the future, on recursive sorting algorithms "
 "(such as QuickSort and MergeSort) or using other microworlds to apply these "
@@ -7696,7 +7827,7 @@ msgstr ""
 "situations."
 
 #. type: Content of: <p>
-#: src/lessons/sort/short_desc.html:3
+#: src/lessons/sort/basic/short_desc.html:3
 msgid ""
 "This lesson allows to experiment with some classical sorting algorithms (and "
 "some less common variant of them :)"
@@ -7705,8 +7836,8 @@ msgstr ""
 "classiques (ainsi qu'avec certaines variantes moins classiques :)"
 
 #. type: Content of: <p>
-#: src/lessons/sort/short_desc.html:6 src/lessons/recursion/short_desc.html:5
-#: src/lessons/maze/short_desc.html:5
+#: src/lessons/sort/basic/short_desc.html:6
+#: src/lessons/recursion/short_desc.html:5 src/lessons/maze/short_desc.html:5
 msgid ""
 "You are supposed to master the bases of programming to take this lesson."
 msgstr ""
@@ -7714,12 +7845,12 @@ msgstr ""
 "cette leçon."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:1
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:1
 msgid "BubbleSort"
 msgstr "Tri à bulle"
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:3
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:3
 msgid ""
 "Welcome to the sorting universe. It allows you to experiment with the "
 "existing sorting algorithms. The list of buildins that you can use in your "
@@ -7732,7 +7863,7 @@ msgstr ""
 "référence du monde (Aide / À propos de cet univers)."
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:7
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:7
 msgid ""
 "It is not enough to sort the array to pass the exercises. Your solution must "
 "strictly follow the expected behavior of each exercise. This is enforced by "
@@ -7745,7 +7876,7 @@ msgstr ""
 "d'écriture sur le tableau effectuées lors de ce tri."
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:12
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:12
 msgid ""
 "When your algorithm diverges from the expectation, understanding the "
 "difference between your code and the expected solution can reveal very "
@@ -7762,12 +7893,12 @@ msgstr ""
 "histoire."
 
 #. type: Content of: <h2>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:27
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:27
 msgid "First attempt at BubbleSort"
 msgstr "Première tentative pour le tri à bulle"
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:29
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:29
 msgid ""
 "This first sorting algorithm is the most simple one: Bubble sort consists in "
 "progressively moving up the smaller elements of the array, as if they were "
@@ -7793,18 +7924,18 @@ msgstr ""
 "jamais utilisé en pratique."
 
 #. type: Attribute 'alt' of: <div>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:39
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:11
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:39
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:11
 msgid "Show Tip (Pseudo-code)"
 msgstr "Montrer l'indice (le pseudo-code)"
 
 #. type: Content of: <div><p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:40
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:40
 msgid "The pseudo-code of the BubbleSort algorithm is the following:"
 msgstr "Le pseudo-code de l'algorithme du tri à bulles est donc le suivant :"
 
 #. type: Content of: <div><pre>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:41
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:41
 #, no-wrap
 msgid ""
 "do: \n"
@@ -7814,16 +7945,16 @@ msgid ""
 msgstr ""
 "faire: \n"
 "        Pour tout i dans [0,lgr-2]\n"
-"          Si les cases i et i+1 doivent être inverser, le faire\n"
+"          Si les cases i et i+1 doivent être inversées, le faire\n"
 "     tant qu'on a inverser des choses lors du dernier parcours\n"
 
 #. type: Content of: <h1>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:1
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:1
 msgid "BubbleSort (take 2)"
 msgstr "Tri à bulle (deuxième version)"
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:3
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:3
 msgid ""
 "If you look carefully at the behavior of BubbleSort, a first easy "
 "optimization appears: after one traversal, the last element of the array "
@@ -7836,19 +7967,19 @@ msgstr ""
 "En étudiant le comportement du tri à bulle, on peut voir une première "
 "optimisation facile à effectuer: Après un parcours, le dernier élément du "
 "tableau est forcément le plus grand d'entre tous car le parcours l'a fait "
-"remonté comme une bulle à sa position. Plus généralement, après N parcours, "
+"remonter comme une bulle à sa position. Plus généralement, après N parcours, "
 "on sait que les N derniers éléments du tableau sont déjà triés. En "
 "conclusion, il n'est pas utile de les recomparer sur les parcours suivants. "
 "Dans un premier temps, nous ferons autant de parcours qu'il y a d'éléments "
 "dans le tableau."
 
 #. type: Content of: <div><p>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:12
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:12
 msgid "The pseudo-code of the BubbleSort2 algorithm is the following:"
 msgstr "Le pseudo-code de l'algorithme BubbleSort2 est le suivant :"
 
 #. type: Content of: <div><pre>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:13
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:13
 #, no-wrap
 msgid ""
 "For all i in [len-2,0] (traversing from biggest to smallest)\n"
@@ -7860,7 +7991,7 @@ msgstr ""
 "          Si les cases j et j+1 doivent être inverser, le faire\n"
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:19
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:19
 msgid ""
 "When we run this algorithm, it is quite disappointing to see that it runs "
 "approximately at the same speed than the basic version of BubbleSort. This "
@@ -7882,7 +8013,7 @@ msgstr ""
 "plus d'un quart du nombre de lectures, ce qui n'est pas si mal."
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:28
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:28
 msgid ""
 "From the asymptotic complexity point of view, there is absolutely no "
 "difference: this variation is still in O(n^2) on average (our gain is only "
@@ -7892,12 +8023,12 @@ msgstr ""
 "variante est toujours en O(n2) en moyenne (on ne gagne que sur la constante)."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:1
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:1
 msgid "BubbleSort (take 3)"
 msgstr "Tri à bulle (troisième version)"
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:3
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:3
 msgid ""
 "Let's now reintroduce the little optimization we removed at previous step: "
 "if a traversal does not swap any element, it means that the array is already "
@@ -7908,26 +8039,27 @@ msgstr ""
 "est maintenant trié. Dans ce cas, il faut arrêter le processus de tri."
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:7
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:8
 msgid ""
-"For that, simply use the <code>break</code> keyword, which breaks the "
-"current loop.  Beware, if you have several embedded loops, this will apply "
-"to the internal one."
+"[!java|python]For that, simply use the <code>break</code> keyword, which "
+"breaks the current loop.  Beware, if you have several embedded loops, this "
+"will apply to the internal one.[/!] [!scala]For that, simply quit the "
+"current function by calling <code>return</code> with no associated value.[/!]"
 msgstr ""
-"Pour cela, utilisez simplement le mot-clé <code>break></code>, qui coupe\n"
-"l'exécutino de la boucle englobante. Attention, si vous avez plusieurs "
-"boucles\n"
-"imbriquées, c'est celle situé tout au fond (au plus près du mot-clé break) "
-"qui\n"
-"est cassée."
+"[!java|python]Pour cela, utilisez simplement le mot-clé <code>break></code>, "
+"qui coupe l'exécution de la boucle englobante. Attention, si vous avez "
+"plusieurs boucles imbriquées, c'est celle situé tout au fond (au plus près "
+"du mot-clé break) qui est cassée.[/!]\n"
+"[!scala]Pour cela, quitez simplement la fonction courante en appellant "
+"<code>return</code> sans lui associer de valeur.[/!]"
 
 #. type: Attribute 'alt' of: <div>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:10
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:13
 msgid "If you want, this tip shows the pseudo-code."
 msgstr "Si vous le désirez, cet indice montre le pseudo-code."
 
 #. type: Content of: <div><pre>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:12
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:15
 #, no-wrap
 msgid ""
 "For all i in [len-2,0] (traversing from biggest to smallest)\n"
@@ -7941,7 +8073,7 @@ msgstr ""
 "       Si le parcours sur les j n'a rien inversé, casser la boucle\n"
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:19
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:22
 msgid ""
 "This optimization is even more disappointing: it only provide a gain of a "
 "few percents on the amount of reads over BubbleSort2."
@@ -7950,12 +8082,12 @@ msgstr ""
 "pourcents en nombre de lectures sur BubbleSort2."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:1
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:1
 msgid "CocktailSort"
 msgstr "Tri Cocktail"
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:3
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:3
 msgid ""
 "To improve further the BubbleSort algorithm, we need to look closer its "
 "behavior. One can notice that big elements are moved very quickly in "
@@ -7971,7 +8103,7 @@ msgstr ""
 "valeurs."
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:9
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:9
 msgid ""
 "To help the turtles moving faster, the cocktail sort traverse alternatively "
 "the array from right to left and from left to right. Here is the pseudo-code:"
@@ -7981,7 +8113,7 @@ msgstr ""
 "son pseudo-code:"
 
 #. type: Content of: <pre>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:14
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:14
 #, no-wrap
 msgid ""
 "Do\n"
@@ -7999,7 +8131,7 @@ msgstr ""
 "tant qu'au moins l'un des parcours a inversé un élément\n"
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:22
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:22
 msgid ""
 "One can see that cocktail sort achieves exactly the same amount of swaps "
 "than the bubble sort, but improves slightly on read amount. It is however "
@@ -8010,12 +8142,12 @@ msgstr ""
 "de lectures. Il reste cependant moins bon que BubbleSort2 en la matière."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/cocktail/AlgCocktailSort2.html:1
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:1
 msgid "CocktailSort (take 2)"
 msgstr "Tri Cocktail (seconde version)"
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort2.html:3
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:3
 msgid ""
 "We will now apply to CocktailSort the same optimization than BubbleSort2 did "
 "to BubbleSort. We must remember the limits of the array part not being "
@@ -8027,36 +8159,36 @@ msgstr ""
 "parcourir alternativement de droite à gauche et de gauche à droite:"
 
 #. type: Content of: <pre>
-#: src/lessons/sort/cocktail/AlgCocktailSort2.html:8
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:8
 #, no-wrap
 msgid ""
 "beg=0; end=len-2\n"
 "do\n"
 "  For all Pour i in [beg,end], do:\n"
 "      If cells i and i+1 must be swapped, do it    \n"
-"  end--\n"
+"  end -= 1 (this means end = end - 1)\n"
 "  For all Pour i in [beg,end] (downwards), do:\n"
 "      If cells i and i+1 must be swapped, do it    \n"
-"  beg++\n"
+"  beg += 1 (this means beg = beg + 1)\n"
 "while at least one of the traversal swapped an element\n"
 msgstr ""
 "debut=0; fin=lgr-2\n"
 "Faire\n"
 "  Pour tout i dans [debut,fin], faire:\n"
 "    si i et i+1 doivent être échangées, le faire\n"
-"  fin--\n"
+"  fin -= 1 (cela veut dire fin = fin -1)\n"
 "  Pour tout i dans [fin, debut] en descendant, faire:\n"
 "    si i et i+1 doivent être échangées, le faire\n"
-"  debut++\n"
+"  debut += 1 (ce qui veut dire debut = debut + 1)\n"
 "tant qu'au moins l'un des parcours a inversé un élément\n"
 
 #. type: Content of: <h1>
-#: src/lessons/sort/cocktail/AlgCocktailSort3.html:1
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort3.html:1
 msgid "CocktailSort (take 3)"
 msgstr "Tri Cocktail (troisième version)"
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort3.html:3
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort3.html:3
 msgid ""
 "Even if the asymptotic complexity of CocktailSort2 is the same than the one "
 "of BubbleSort, it seem to perform better in practice. It is even possible to "
@@ -8069,16 +8201,16 @@ msgstr ""
 "à bulle, il semble bien mieux s'en tirer en pratique. On peut encore "
 "l'améliorer un tout petit peu en arretant tout si le parcours dans l'ordre "
 "croissant n'a rien inversé, sans faire le parcours dans l'ordre "
-"descroissant. De même, on peut quiter si le parcours croissant a inversé des "
-"choses, mais pas le parcours décroissant."
+"descroissant. De même, on peut quitter si le parcours croissant a inversé "
+"des choses, mais pas le parcours décroissant."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:1
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:1
 msgid "InsertionSort"
 msgstr "Tri par insertion"
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:4
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:4
 msgid ""
 "This sorting algorithm is quite simple to understand and write, even if it "
 "is not as efficient as possible. Its asymptotic complexity is in O(n2), but "
@@ -8092,7 +8224,7 @@ msgstr ""
 "et N2/4 en moyenne)."
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:9
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:9
 msgid ""
 "The idea is to traverse all elements of the array, and to insert each of "
 "them into its proper position in the already sorted part of the array. When "
@@ -8107,39 +8239,39 @@ msgstr ""
 "tableau."
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:17
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:17
 msgid "Once this is done, the situation is the following:"
 msgstr "Une fois ceci fait, on se retrouve dans la situation suivante:"
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:21
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:21
 msgid "The pseudo-code of this algorithm is thus the following:"
 msgstr "Le pseudo-code de cet algorithme est donc le suivant :"
 
 #. type: Content of: <pre>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:22
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:22
 #, no-wrap
 msgid ""
-"For each i in [1,len]\n"
-"  store the value of i in a variable val\n"
-"  copy the cell i-1 into i if i-1 contains a value bigger than val\n"
-"  copy the cell i-2 into i-1 if i-2 contains a value bigger than val\n"
-"  copy the cell i-3 into i-2 if i-3 contains a value bigger than val\n"
-"  copy the cell i-4 into i-3 if i-4 contains a value bigger than val\n"
+"For each i in [1,len-1]\n"
+"  store the value of i in a variable v\n"
+"  copy the cell i-1 into i if i-1 contains a value bigger than v\n"
+"  copy the cell i-2 into i-1 if i-2 contains a value bigger than v\n"
+"  copy the cell i-3 into i-2 if i-3 contains a value bigger than v\n"
+"  copy the cell i-4 into i-3 if i-4 contains a value bigger than v\n"
 "  ...\n"
-"  copy val into the last cell copied above\n"
-msgstr ""
-"Pour tout i dans [1,lgr]\n"
-"  stoquer la valeur de la case i dans une variable val\n"
-"  recopier la case i-1 dans i, si i-1 contient une valeur plus grande que val\n"
-"  recopier la case i-2 dans i-1, si i-2 contient une valeur plus grande que val  \n"
-"  recopier la case i-3 dans i-2, si i-3 contient une valeur plus grande que val  \n"
-"  recopier la case i-4 dans i-3, si i-4 contient une valeur plus grande que val\n"
+"  copy v into the last cell copied above\n"
+msgstr ""
+"Pour tout i dans [1,lgr-1]\n"
+"  stocker la valeur de la case i dans une variable v\n"
+"  recopier la case i-1 dans i, si i-1 contient une valeur plus grande que v\n"
+"  recopier la case i-2 dans i-1, si i-2 contient une valeur plus grande que v\n"
+"  recopier la case i-3 dans i-2, si i-3 contient une valeur plus grande que v\n"
+"  recopier la case i-4 dans i-3, si i-4 contient une valeur plus grande que v\n"
 "  ...\n"
-"  recopier val dans la dernière case recopiée plus haut\n"
+"  recopier v dans la dernière case recopiée plus haut\n"
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:32
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:32
 msgid ""
 "Naturally, you should use a loop to write the big permutation within the "
 "given loop. Writing it this way would be really ... counter-productive."
@@ -8149,7 +8281,7 @@ msgstr ""
 "vraiment ... contre-productif."
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:35
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:35
 msgid ""
 "If you've always wondered what computer science researchers do nowadays, "
 "here is part of the answer: They improve fundamental algorithms so that "
@@ -8161,12 +8293,12 @@ msgstr ""
 "faire des programmes efficaces..."
 
 #. type: Content of: <h2>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:39
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:39
 msgid "Other variation of insertion sort"
 msgstr "D'autres variantes du tri par insertion"
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:41
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:41
 msgid ""
 "TreeSort builds a binary search tree to sort them. It leads to a O(n "
 "log(n))  on average, but O(n^2) in worst cases. We won't study this "
@@ -8180,7 +8312,7 @@ msgstr ""
 "dela de nos objectifs présents."
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:46
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:46
 msgid ""
 "There is other variations over the insertion sort, such as PatienceSort "
 "which builds piles of values and sort each pile afterward. This algorithm "
@@ -8194,10 +8326,10 @@ msgstr ""
 "algorithme présente un pire cas en O(nlog n), et une complexité spatiale en "
 "O(n).  LibrarySort (proposé en 2004) échange également un peu d'espace pour "
 "du temps puisqu'il présente une complexité moyenne en O(n log n), mais "
-"nécessite de stoquer des données supplémentaires."
+"nécessite de stocker des données supplémentaires."
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:53
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:53
 msgid ""
 "Wikipedia provides a detailled description of all these algorithms we cannot "
 "present here because of time constraints."
@@ -8206,12 +8338,12 @@ msgstr ""
 "algorithmes que nous n'avons pas le temps de détailler ici."
 
 #. type: Content of: <h2>
-#: src/lessons/sort/shell/AlgShellSort.html:1
+#: src/lessons/sort/basic/shell/AlgShellSort.html:1
 msgid "ShellSort"
 msgstr "Tri Shell"
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/sort/shell/AlgShellSort.html:3
+#: src/lessons/sort/basic/shell/AlgShellSort.html:3
 msgid ""
 "This algorithm is named after its author, Donald Shell, who published it in "
 "1959. It can be seen as an application of the CombSort idea (let elements "
@@ -8238,7 +8370,7 @@ msgstr ""
 "précédentes."
 
 #. type: Content of: <p>
-#: src/lessons/sort/shell/AlgShellSort.html:14
+#: src/lessons/sort/basic/shell/AlgShellSort.html:14
 msgid ""
 "Donald Shell propose <code>len/2</code> as initial value of the gap, and "
 "then to divide it by 2 at each step. The pseudo-code is thus the following:"
@@ -8248,7 +8380,7 @@ msgstr ""
 "suivant:"
 
 #. type: Content of: <p><pre>
-#: src/lessons/sort/shell/AlgShellSort.html:17
+#: src/lessons/sort/basic/shell/AlgShellSort.html:17
 #, no-wrap
 msgid ""
 "gap=len/2\n"
@@ -8260,7 +8392,7 @@ msgstr ""
 "  appliquer l'algorithme de tri par insertion en comparant i-gap et i, puis i-2gap et i-gap, puis i-3gap et i-2gap, etc.\n"
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/shell/AlgShellSort.html:22
+#: src/lessons/sort/basic/shell/AlgShellSort.html:22
 msgid ""
 "Just like in CombSort, the sequence of values taken by the gap is crucial "
 "for Shell sort performance. In some rare pathological cases, the sequence we "
@@ -8284,7 +8416,7 @@ msgstr ""
 "est correctement implémenté."
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/shell/AlgShellSort.html:32
+#: src/lessons/sort/basic/shell/AlgShellSort.html:32
 msgid ""
 "In our case, the array are ways too small to benefit of these optimizations. "
 "If you ever need to do so, take as initial gap the biggest value of the "
@@ -8298,7 +8430,7 @@ msgstr ""
 "descendant ensuite."
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/shell/AlgShellSort.html:37
+#: src/lessons/sort/basic/shell/AlgShellSort.html:37
 msgid ""
 "Interestingly enough, determining the best gap sequence for shell sort turns "
 "into a research issue of our century in computer science. For example, an "
@@ -8317,12 +8449,12 @@ msgstr ""
 "Computation Theory, LNCS 2001; Vol. 2138)."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/selection/AlgSelectionSort.html:1
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:1
 msgid "Selection Sort"
 msgstr "Tri par selection"
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/sort/selection/AlgSelectionSort.html:3
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:3
 msgid ""
 "In this exercise we will implement another classical algorithm: selection "
 "sort."
@@ -8331,7 +8463,7 @@ msgstr ""
 "classique : le tri par sélection."
 
 #. type: Content of: <p>
-#: src/lessons/sort/selection/AlgSelectionSort.html:6
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:6
 msgid ""
 "The idea is simply to select for each cell of the array the smallest value "
 "from the part not already sorted. Thus for the first cell, it takes the "
@@ -8345,7 +8477,7 @@ msgstr ""
 "n'étant pas encore triées."
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/selection/AlgSelectionSort.html:12
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:12
 msgid ""
 "More generally, for the cell N, it looks the cell M in [n;len] containing "
 "the smallest possible value of the interval. Then, it swaps the content of "
@@ -8356,12 +8488,12 @@ msgstr ""
 "et celui de la case M."
 
 #. type: Content of: <p><p><h2>
-#: src/lessons/sort/selection/AlgSelectionSort.html:16
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:16
 msgid "Existing variations"
 msgstr "Variantes possibles"
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/selection/AlgSelectionSort.html:17
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:17
 msgid ""
 "Another classical algorithm which idea is based on the selection of good "
 "elements is HeapSort, but it uses a heap data structure which we did not see "
@@ -8375,12 +8507,12 @@ msgstr ""
 "algorithme très intéressant en pratique."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/comb/AlgCombSort.html:1
+#: src/lessons/sort/basic/comb/AlgCombSort.html:1
 msgid "CombSort"
 msgstr "Tri à peigne"
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort.html:3
+#: src/lessons/sort/basic/comb/AlgCombSort.html:3
 msgid ""
 "We saw that CocktailSort improve a bit for turtles (i.e. small values near "
 "to the end of the array), but it is still possible to achieve better. "
@@ -8406,7 +8538,7 @@ msgstr ""
 "fois amène de bons résultats. Voici le pseudo-code correspondant :"
 
 #. type: Content of: <pre>
-#: src/lessons/sort/comb/AlgCombSort.html:15
+#: src/lessons/sort/basic/comb/AlgCombSort.html:15
 #, no-wrap
 msgid ""
 "gap = len;\n"
@@ -8416,7 +8548,7 @@ msgid ""
 "   i = O\n"
 "   while i+gap < len do:\n"
 "     if i and i+gap must be swapped, do it\n"
-"     increase i by the gap\n"
+"     increase i by one\n"
 "while the gap is bigger than 1 or the last traversal swapped at least one pair\n"
 msgstr ""
 " ecart = lgr;\n"
@@ -8426,57 +8558,78 @@ msgstr ""
 "   i = O\n"
 "   tant que i+ecart < lgr faire:\n"
 "     si i et i+ecart doivent être inversés, le faire\n"
-"     ajouter ecart à i\n"
+"     incrémenter i de 1\n"
 " tant que l'écart est plus grand que 1 ou que le dernier parcours a inversé au moins un élément\n"
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/sort/comb/AlgCombSort.html:26
+#: src/lessons/sort/basic/comb/AlgCombSort.html:26
 #: src/lessons/maze/island/IslandMaze.html:66
 #: src/lessons/welcome/bat/bool1/Max1020.html:5
 msgid "[!scala]"
 msgstr "[!scala]"
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort.html:26
+#: src/lessons/sort/basic/comb/AlgCombSort.html:26
 msgid ""
-"One tricky part is that we want to divide gap, that is an integer, by 1.3, "
-"that is a double.  The type system of scala won't let us do this, because "
-"such discrepency usually denotes a programmer error.  As this is not an "
-"error this time, we have to convert gap to Double for the time of the "
-"operation, and then convert the result back to Int to store it into gap. "
+"One tricky part is that we want to divide gap, that is an integer (of type "
+"Int), by 1.3, that is a Double.  The type system of scala won't let us do "
+"this, because such discrepancy usually denotes a programmer error.  As this "
+"is not an error this time, we have to convert gap to Double for the time of "
+"the operation, and then convert the result back to Int to store it into gap. "
 "This should be written this way:"
 msgstr ""
 "L'un des problèmes à résoudre est que la variable <code>ecart</code> est "
-"entière, et que nous voulons la diviser par 1.3, qui est un double. Le "
-"système de types de scala ne vous laissera pas faire une chose pareil sans "
-"broncher. C'est que ce genre de disparité est souvent le signe de problèmes "
-"que le programmeur n'a pas vu. Comme ce n'est pas une erreur dans notre cas, "
-"nous allons devoir convertir <code>ecart</code> en double pour le temps de "
+"entière (de type <code>Int</code>), et que nous voulons la diviser par 1.3, "
+"qui est un nombre à virgule (de type <code>Double</code>). Le système de "
+"types de scala ne vous laissera pas faire une chose pareil sans broncher. "
+"C'est que ce genre de disparité est souvent le signe de problèmes que le "
+"programmeur n'a pas vu. Comme ce n'est pas une erreur dans notre cas, nous "
+"allons devoir convertir <code>ecart</code> en double pour le temps de "
 "l'opération, puis convertir le résultat de retour en entier pour le stocker "
 "dans <code>ecart</code>. Cela s'écrit de la manière suivante:"
 
 #. type: Content of: <pre>
-#: src/lessons/sort/comb/AlgCombSort.html:30
+#: src/lessons/sort/basic/comb/AlgCombSort.html:30
 #, no-wrap
 msgid "gap = (gap.asInstanceOf[Double] / 1.3).asInstanceOf[Int]"
 msgstr "ecart = (ecart.asInstanceOf[Double] / 1.3).asInstanceOf[Int]"
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort.html:31
+#: src/lessons/sort/basic/comb/AlgCombSort.html:31
 msgid ""
 "This is rather verbose, but actually, this notation is not very complex. And "
 "remember that the type checker is your friend. It's picky and sometimes "
 "annoying (as on this one), but it often catches weird bugs that would have "
-"been a pain to debug if not catched by the type checker."
+"been a pain to debug if not catch by the type checker. And since the Scala's "
+"authors are pragmatic, the previous expression can be simplified:"
 msgstr ""
 "C'est un peu bavard, mais finalement, cette écriture n'est pas très "
 "complexe. Et n'oubliez pas que le système de types est votre ami. Il est un "
 "peu tatillon et parfois un peu pénible (comme aujourd'hui), mais au fond, il "
 "trouve souvent des bugs bizarres qui auraient été très pénibles à débugger "
-"s'il ne les avait pas attrapé à la source."
+"s'il ne les avait pas attrapé à la source. Et comme de plus les auteurs de "
+"Scala sont pragmatiques, cela peut aussi de manière simplifiée :"
+
+#. type: Content of: <pre>
+#: src/lessons/sort/basic/comb/AlgCombSort.html:35
+#, no-wrap
+msgid "gap = (gap.toDouble / 1.3).toInt"
+msgstr "ecart = (ecart.toDouble / 1.3).toInt"
+
+#. type: Content of: <p>
+#: src/lessons/sort/basic/comb/AlgCombSort.html:36
+msgid ""
+"<code>toDouble</code> and <code>toInt</code> are just shortcuts for the "
+"corresponding expressions <code>asInstanceOf[Double]</code> and "
+"<code>asInstanceOf[Int]</code>. It's not very generic, but it's very handy."
+msgstr ""
+"<code>toDouble</code> et <code>toInt</code> sont simplement des raccourcis "
+"pour les expressions équivalentes <code>asInstanceOf[Double]</code> et "
+"<code>asInstanceOf[Int]</code>. Ce n'est pas très générique, mais c'est "
+"extrêmement pratique."
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort.html:36
+#: src/lessons/sort/basic/comb/AlgCombSort.html:40
 msgid ""
 "This algorithm was invented by Wlodek Dobosiewicz in 1980, and later "
 "rediscovered and popularized by Stephen Lacey and Richard Box, who described "
@@ -8487,12 +8640,12 @@ msgstr ""
 "magazine Byte d'avril 1991."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/comb/AlgCombSort11.html:1
+#: src/lessons/sort/basic/comb/AlgCombSort11.html:1
 msgid "CombSort11"
 msgstr "Tri à peigne 11"
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort11.html:3
+#: src/lessons/sort/basic/comb/AlgCombSort11.html:3
 msgid ""
 "The authors of this algorithm observed that the performance is increased if "
 "we make sure that the last values of the gap are (11, 8, 6, 4, 3, 2, 1)  "
@@ -8507,12 +8660,12 @@ msgstr ""
 "jour de l'écart que si la valeur est 9 ou 10, il faut utiliser 11 à la place."
 
 #. type: Content of: <h1>
-#: src/lessons/sort/gnome/AlgGnomeSort.html:1
+#: src/lessons/sort/basic/gnome/AlgGnomeSort.html:1
 msgid "GnomeSort"
 msgstr "Tri du gnome"
 
 #. type: Content of: <p>
-#: src/lessons/sort/gnome/AlgGnomeSort.html:3
+#: src/lessons/sort/basic/gnome/AlgGnomeSort.html:3
 msgid ""
 "The Gnome sort is similar to insertion sort, but the elements are moved in "
 "position by a serie of swaps just like in bubble sort. It is named after the "
@@ -8526,7 +8679,7 @@ msgstr ""
 "auteur:"
 
 #. type: Content of: <p>
-#: src/lessons/sort/gnome/AlgGnomeSort.html:8
+#: src/lessons/sort/basic/gnome/AlgGnomeSort.html:8
 msgid ""
 "Gnome Sort is based on the technique used by the standard Dutch Garden Gnome "
 "(Du.: tuinkabouter). Here is how a garden gnome sorts a line of flower pots. "
@@ -8696,7 +8849,6 @@ msgstr ""
 
 #. type: Content of: <p><p><p><h2>
 #: src/lessons/recursion/square/FourSquare.html:47
-#: src/lessons/recursion/circle/Circle.html:14
 #: src/lessons/recursion/hanoi/HanoiBoard.html:20
 #: src/lessons/welcome/array/basics/Array1.html:229
 msgid "Goal of this exercise"
@@ -8749,7 +8901,6 @@ msgstr "[!java]void [/!]polygonFractal ([!java]int [/!]niveaux[!scala]:Int[/!],
 
 #. type: Content of: <p>
 #: src/lessons/recursion/polygonfractal/PolygonFractal.html:7
-#: src/lessons/recursion/sierpinski/Sierpinski.html:8
 #: src/lessons/recursion/dragoncurve/DragonCurve1.html:25
 #: src/lessons/recursion/dragoncurve/DragonCurve2.html:44
 msgid ""
@@ -8768,7 +8919,7 @@ msgstr "Flocons de neige"
 #: src/lessons/recursion/koch/Koch.html:3
 msgid ""
 "We will now draw snow flakes using the Koch fractal. A fractal is a "
-"geometrical pattern repeated at every scale."
+"geometric pattern repeated at every scale."
 msgstr ""
 "Nous allons maintenant dessiner des flocons de neige en utilisant la "
 "fractale de Koch.  Une fractale est un dessin géométrique dont le motif se "
@@ -8777,142 +8928,39 @@ msgstr ""
 #. type: Content of: <p>
 #: src/lessons/recursion/koch/Koch.html:6
 msgid ""
-"The general form is a triangle, with each side given by a serie of recursive "
-"calls. The general form is given by something like this:"
-msgstr ""
-"La forme générale est un triangle dont chaque coté est donné par une série "
-"d'appels récursifs.  La forme générale est obtenue en enchainant trois cotés "
-"de la façon suivante."
-
-#. type: Content of: <p><pre>
-#: src/lessons/recursion/koch/Koch.html:8
-#, no-wrap
-msgid ""
-"[!java]void [/!]snowFlake ([!java]int [/!]levels[!scala]:Int[/!], [!java]double [/!]length[!scala]:Double[/!])[!python]:[/!][!java|scala] {[/!]\n"
-"   snowSide(levels, length);\n"
-"   right(120);\n"
-"   snowSide(levels, length);\n"
-"   right(120);\n"
-"   snowSide(levels, length);\n"
-"   right(120);\n"
-"[!java|scala]}[/!]"
+"The general form is a triangle, with each side given by several recursive "
+"calls. Your work is only to write the code of the <code>snowSide</code> "
+"method so that it draws one side of the triangle. To make it easier, each "
+"sides are represented in a specific color. Just draw the red things (without "
+"changing your pen color), and the other colors will be drawn automatically."
 msgstr ""
-"[!java]void [/!]snowFlake ([!java]int [/!]niveaux[!scala]:Int[/!], [!java]double [/!]longueur[!scala]:Double[/!])[!python]:[/!][!java|scala] {[/!]\n"
-"   snowSide(niveaux, longueur);\n"
-"   right(120);\n"
-"   snowSide(niveaux, longueur);\n"
-"   right(120);\n"
-"   snowSide(niveaux, longueur);\n"
-"   right(120);\n"
-"[!java|scala]}[/!]"
+"La forme générale est une sorte de triangle, dont chaque coté est généré par "
+"des appels récursifs.\n"
+"Vous ne devez dessiner qu'un coté de ce triangle dans la fonction "
+"<code>snowSide</code>. \n"
+"Pour simplifier les choses, chaque coté a une couleur particulière. "
+"Contentez vous de dessiner les choses en rouge (sans changer votre couleur), "
+"et les autres couleurs seront dessinées automatiquement."
 
-#. type: Content of: <p><p>
-#: src/lessons/recursion/koch/Koch.html:17
+#. type: Content of: <p>
+#: src/lessons/recursion/koch/Koch.html:12
 msgid ""
 "Observe the drawing in each world's objective to understand the pattern's "
 "logic, and then reproduce it. You must write the <code>snowSide()</code> "
-"method, which is recursive."
+"method, which is recursive but <b>do not call snowFlake from snowSide</b>, "
+"or you will get very strange unexpected behaviors."
 msgstr ""
 "Observez le dessin dans chaque monde objectif pour comprendre la logique de "
 "ce motif afin de la reproduire.  Vous devez écrire la fonction snowSide, qui "
-"est récursive."
-
-#. type: Content of: <h2>
-#: src/lessons/recursion/star/Star.html:1
-msgid "Turtles in the stars"
-msgstr "Tortues dans les étoiles"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/recursion/star/Star.html:3
-msgid ""
-"This is the last hand-on turtles exercise before recursion. The goal is to "
-"draw three 5-branches stars. Like any regular stars with N branches, the "
-"angle at each external corners are 360/N degrees while the angles between "
-"branches are of 2*360/N degrees."
-msgstr ""
-"Voici un dernier exercice de prise en main avant la récursion. Il s'agit de "
-"faire dessiner trois étoiles à 5 branches à la tortue. Comme toutes les "
-"étoiles régulières à N branches, les angles des pointes sont de 360/N degrés "
-"tandis que les angles entre les pointes sont de 2*360/N degrés."
-
-#. type: Content of: <p>
-#: src/lessons/recursion/star/Star.html:8
-msgid ""
-"The first star to draw is black (<code>Color.black</code>) and its branches "
-"are 100 steps long. The second is blue (<code>Color.blue</code>) and its "
-"branches are 80 steps long. It's shifted of 45 degrees from the first one. "
-"The last star is red (<code>Color.red</code>), its branches are 60 steps "
-"long and it's shifted of 45 degrees from the previous one."
-msgstr ""
-"La première étoile à dessiner est noire (<code>Color.black</code>) et ses "
-"branches font 100 pas de longueur, la seconde est bleue (<code>Color.blue</"
-"code>) et ses branches font 80 pas de longueur. Elle est décallée de 45 "
-"degrés vers le bas par rapport à la première.  La dernière étoile est rouge "
-"(<code>Color.red</code>), ses branches font 60 pas, et elle est décallée de "
-"45 degrés par rapport à la seconde."
-
-#. type: Content of: <p>
-#: src/lessons/recursion/star/Star.html:14
-msgid "Observe the world's objective to visualize the picture to draw."
-msgstr "Consultez l'objectif du monde pour visualiser la figure à réaliser."
-
-#. type: Content of: <h2>
-#: src/lessons/recursion/circle/Circle.html:1
-msgid "Three little circles"
-msgstr "Trois petits cercles"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/recursion/circle/Circle.html:3
-msgid ""
-"As we saw (and as you can check in the documentation of this world under "
-"\"About this world\"), turtles can only draw straight lines. Despite of "
-"this, the goal of this world is to draw circles... This can be achived "
-"simply by realizing that a circle can be seen as a concatenation of very "
-"little segments."
-msgstr ""
-"Comme nous l'avons vu (et comme vous pouvez le vérifier en consultant l'aide "
-"de ce monde dans le menu \"À propos de ce monde\"), les tortues ne savent "
-"que se déplacer en ligne droite. Et pourtant, l'objectif de cet exercice est "
-"de leur faire dessiner des cercles... On peut pourtant résoudre ce problème "
-"simplement en réalisant qu'un cercle peut être représenté comme une "
-"concaténation de petits segments."
-
-#. type: Content of: <p>
-#: src/lessons/recursion/circle/Circle.html:9
-msgid ""
-"Differential calculus would even argue that a circle is the asymptotical "
-"limit of such construct when the size of each segment becomes infinitely "
-"small while their amount becomes infinitely large, but you can definitely "
-"solve this exercise without understanding differential calculus :)"
-msgstr ""
-"Les amateurs de calcul différentiel diraient même sans doute qu'un cercle "
-"est la limite asymptotique d'une telle construction quand la taille des "
-"segments tend vers zéro alors que leur nombre tend vers l'infini, mais il "
-"est tout à fait possible de réussir cet exercice sans maîtriser le calcul "
-"différentiel :)"
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/recursion/circle/Circle.html:16
-msgid ""
-"Write a function drawing a circle, taking the size of each of the 360 "
-"segments as parameter. Then use it in your code to draw the whole picture.  "
-"The first circle is obtained with segments of size 0.5, the second with "
-"segments of size 1 and the last one with 1.5-long segments.  Once again, "
-"this is a warming exercise, no recursion is needed."
-msgstr ""
-"Écrivez une fonction dessinant un cercle, avec la taille de chacun des 360 "
-"pas passée en paramètre. Utilisez la ensuite dans votre code pour réaliser "
-"la figure dans son ensemble. Le premier cercle s'obtient avec des pas de "
-"0.5, le second avec des pas de 1 et le troisième avec des pas de 1.5. Encore "
-"une fois, il s'agit d'un exercice de prise en main, et aucune récursion "
-"n'est nécessaire."
+"est récursive. Mais <b>n'appelez pas snowFlake depuis snowSide</b>, car "
+"sinon le résultat sera vraiment étrange et inattendu."
 
 #. type: Content of: <h2>
 #: src/lessons/recursion/tree/Tree.html:1
 msgid "Trees"
 msgstr "Arbres"
 
-#. type: Content of: outside any tag (error?)
+#. type: Content of: <p>
 #: src/lessons/recursion/tree/Tree.html:3
 msgid ""
 "We will now draw trees. For that, we will write a method using double "
@@ -8933,14 +8981,15 @@ msgid ""
 "To draw a tree of four levels, you have to draw a trunk of the given length, "
 "turn right of the given angle, draw a tree of level 3, turn left twice of "
 "the given angle, draw another tree of level 3, and come back to your initial "
-"location."
+"location. Don't forget to come back to the initial location!"
 msgstr ""
 "Pour dessiner un arbre à quatre étages, il faut dessiner un tronc de la "
 "taille indiquée, tourner à droite de l'angle indiqué, faire un arbre à 3 "
 "étages, tourner à gauche de deux fois l'angle indiqué, faire un autre arbre "
-"à 3 étages, puis revenir à sa position initiale."
+"à 3 étages, puis revenir à sa position initiale. N'oubliez pas de revenir à "
+"la position initiale !"
 
-#. type: Content of: <p><p>
+#. type: Content of: <p><p><p>
 #: src/lessons/recursion/tree/Tree.html:12
 msgid ""
 "If a tree's trunk is of length 'len', the trunk of the next level tree will "
@@ -8949,6 +8998,44 @@ msgstr ""
 "Si le tronc d'un arbre mesure length à l'étage N, il mesure shrink*length à "
 "l'étage N+1."
 
+#. type: Content of: <p><p><p><p><p>
+#: src/lessons/recursion/tree/Tree.html:15
+msgid ""
+"As you can see, each recursion level is represented by a distinctive color. "
+"For that, you have to call the <code>current(step)</code>, passing the "
+"current recursion level as a parameter. This will pick the right color for "
+"you.  Don't erase your great colors when you move back to your initial "
+"location."
+msgstr ""
+"Comme vous pouvez le voir, chaque étage de la récursion est représenté par "
+"une couleur distinctive. Pour cela, appelez la fonction <code>current(step)</"
+"code> en lui passant en paramètre l'étage actuel de la récursion. Elle se "
+"chargera de choisir la couleur adéquate. N'effacez pas vos couleurs quand "
+"vous retournez à votre position initiale."
+
+#. type: Content of: <p><p><p><p><p>
+#: src/lessons/recursion/tree/Tree.html:19
+msgid ""
+"If you get your function wrong, this can easily become hairly to debug as "
+"your errors will appear at each level of the recursion, completely changing "
+"the drawing.  For debugging purpose, you can use the <code>subtree()</code> "
+"that will draw a correct subtree. This function is then very similar to the "
+"one you are trying to write. The only difference is that <code>subtree()</"
+"code> only draws in black. So, you can use it instead of a recursive call to "
+"debug your code, but you have to change for a proper recursive call to your "
+"own code (once it works)  to get the colors right, and pass the exercise."
+msgstr ""
+"Si vous vous trompez dans votre fonction, il peut facilement devenir très "
+"compliqué de debugger votre code. Vos erreurs se produisant à tous les "
+"étages de la récursion, le dessin peut vite devenir illisible. Pour vous "
+"aider à debugger, vous pouvez utiliser la fonction <code>subtree()</code> "
+"qui dessine un sous-arbre correct. Cette fonction est très (très) semblable "
+"par ailleurs à la fonction que vous tentez d'écrire. La seule différence est "
+"que <code>subtree()</code> ne dessine qu'en noir. Vous pouvez donc "
+"l'utiliser à la place de vos appels récursifs pendant le debug, mais vous "
+"devez changer pour des appels récursifs à votre propre code (quand il "
+"marche) pour avoir les couleurs justes, et donc pour passer l'exercice. "
+
 #. type: Content of: <h2>
 #: src/lessons/recursion/sierpinski/Sierpinski.html:1
 msgid "Sierpinski's Triangle"
@@ -8958,8 +9045,8 @@ msgstr "Triangle de Sierpinski"
 #: src/lessons/recursion/sierpinski/Sierpinski.html:3
 msgid ""
 "The fractal we will now draw is formed of a big triangle inside which "
-"several smaller triangles are embeeded. The prototype of the fuction to draw "
-"it is the following:"
+"several smaller triangles are embedded. The prototype of the function to "
+"draw it is the following:"
 msgstr ""
 "La fractale que nous allons dessiner maintenant est formée d'un triangle "
 "dans lequel sont imbriqués des triangles plus petits.  Le prototype de la "
@@ -8971,6 +9058,20 @@ msgstr ""
 msgid "[!java]void [/!]sierpinski([!java]int [/!]level[!scala]:Int[/!], [!java]double [/!]length[!scala]:Double[/!])"
 msgstr "[!java]void [/!]sierpinski([!java]int [/!]niveau[!scala]:Int[/!], [!java]double [/!]longueur[!scala]:Double[/!])"
 
+#. type: Content of: <p>
+#: src/lessons/recursion/sierpinski/Sierpinski.html:8
+msgid ""
+"Have a look at each world's objective view to understand how to write the "
+"function.  To draw one side of the triangle, draw a smaller recursive "
+"triangle (halve the length) and move forward by the requested length.  "
+"Globally, you have to draw 3 such sides and turn by 120 between each side."
+msgstr ""
+"Consultez les objectifs des différents mondes pour comprendre le code que "
+"vous devez écrire. Pour dessiner un coté du triangle, vous devez dessiner un "
+"triangle récursif plus petit (avec la moitié de la taille) et avancer de la "
+"longueur demandée. Au total, vous devez dessiner 3 cotés de la sorte en "
+"tournant de 120 entre chaque."
+
 #. type: Content of: <h2>
 #: src/lessons/recursion/spiral/Spiral.html:1
 msgid "Spirals"
@@ -9045,81 +9146,45 @@ msgstr ""
 msgid "Drawing spirals"
 msgstr "Faire des spirales"
 
-#. type: Content of: outside any tag (error?)
+#. type: Content of: <p>
 #: src/lessons/recursion/spiral/SpiralUse.html:3
 msgid ""
-"Can you reproduce the provided patterns of this exercise using the "
-"<code>spiral()</code> method?"
+"This exercise is not really an exercise in that sense that you just have to "
+"click on the Execute button to get the reward: All the needed code is "
+"already provided. Instead, you can here explore the possibilities of the "
+"code you just wrote by changing the parameters of the call to the "
+"<code>spiral</code> function. You can move on to the next exercise if you "
+"are short on time, and come back later to play around."
 msgstr ""
-"Saurez-vous faire les différents motifs de cet exercice en utilisant la "
-"méthode <code>spiral()</code>?"
+"Cet exercice est un peu particulier, car vous n'avez rien à faire pour le "
+"passer. Tout le code nécessaire pour le passer est fourni, et il suffit de "
+"cliquer sur le bouton «Exécuter». Il est là pour vous permettre d'explorer "
+"les possibilités du code que vous venez d'écrire en changeant les paramètres "
+"de l'appel à la fonction <code>spiral</code>. Vous pouvez passer à "
+"l'exercice suivant si le temps vous manque, puis revenir jouer ici plus tard."
 
 #. type: Content of: <p>
-#: src/lessons/recursion/spiral/SpiralUse.html:6
+#: src/lessons/recursion/spiral/SpiralUse.html:9
 msgid ""
-"You must provide a method called <code>doit(page)</code> taking the page "
-"number to draw as parameter. Its code is as following, with A0, B0, etc "
-"being integers.  The goal of this exercise is to find the good values for "
-"each page, which requires to correctly understand how the spiral method "
-"works."
-msgstr ""
-"Vous devez écrire une méthode <code>doit(page)</code> qui prend en paramètre "
-"le numéro de la page à dessiner. Son code est de la forme suivante. A0, B0, "
-"etc sont des nombres entiers. L'objectif de l'exercice est de retrouver les "
-"valeurs convenables pour chaque page."
-
-#. type: Content of: <pre>
-#: src/lessons/recursion/spiral/SpiralUse.html:12
-#, no-wrap
-msgid ""
-"[!java]void [/!]doit([!java]int [/!]page[!scala]:Int[/!])[!python]:[/!][!java|scala] {[/!]\n"
-"  [!java]switch (page) {[/!][!scala]page match {[/!][!python]  # select on the value of page[/!]\n"
-"    [!java]case 0:[/!][!scala]case 0 =>[/!][!python]if page==0:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the first page, dubbed \"One\"</span>\n"
-"      spiral(A0,B0,C0,D0);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 1:[/!][!scala]case 1 =>[/!][!python]if page==1:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the second page, dubbed \"Two\"</span>\n"
-"      spiral(A1,B1,C1,D1);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 2:[/!][!scala]case 2 =>[/!][!python]if page==2:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the page dubbed \"Three\"</span> \n"
-"      spiral(A2,B2,C2,D2);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 3:[/!][!scala]case 3 =>[/!][!python]if page==3:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the page dubbed \"Four\"</span> \n"
-"      spiral(A3,B3,C3,D3);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 4:[/!][!scala]case 4 =>[/!][!python]if page==4:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the page dubbed \"Five\"</span>\n"
-"      spiral(A4,B4,C4,D4);[!java|scala]\n"
-"[!java]      break;[/!]\n"
-"  }\n"
-"}[/!]"
+"Here are some of the figures that you can produce with your <code>Spiral</"
+"code> function, provided that you come with the right parameters. You can "
+"switch to the creative mode (from the Session menu)  to disable the world "
+"comparison when you explore with these spirals."
 msgstr ""
-"[!java]void [/!]doit([!java]int [/!]page[!scala]:Int[/!])[!python]:[/!][!java|scala] {[/!]\n"
-"  [!java]switch (page) {[/!][!scala]page match {[/!][!python]  # Choix en fonction de la valeur de page[/!]\n"
-"    [!java]case 0:[/!][!scala]case 0 =>[/!][!python]if page==0:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Dessin sur la première page, nommée \"One\"</span>\n"
-"      spiral(A0,B0,C0,D0);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 1:[/!][!scala]case 1 =>[/!][!python]if page==1:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Dessin sur la seconde page, nommée \"Two\"</span>\n"
-"      spiral(A1,B1,C1,D1);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 2:[/!][!scala]case 2 =>[/!][!python]if page==2:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Dessin sur la troisième page, nommée \"Three\"</span> \n"
-"      spiral(A2,B2,C2,D2);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 3:[/!][!scala]case 3 =>[/!][!python]if page==3:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Dessin sur la quatrième page, nommée \"Four\"</span> \n"
-"      spiral(A3,B3,C3,D3);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 4:[/!][!scala]case 4 =>[/!][!python]if page==4:[/!] <span class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Dessin sur la cinquième page, nommée \"Five\"</span>\n"
-"      spiral(A4,B4,C4,D4);[!java|scala]\n"
-"[!java]      break;[/!]\n"
-"  }\n"
-"}[/!]"
+"Voici quelques figures que l'on peut produire avec votre fonction "
+"<code>spiral</code> en lui passant les bons paramètres. Passez en mode "
+"créatif (dans le menu session) pour désactiver la correction de votre code "
+"quand vous explorez ces spirales."
 
 #. type: Content of: <p>
-#: src/lessons/recursion/spiral/SpiralUse.html:33
+#: src/lessons/recursion/spiral/SpiralUse.html:18
 msgid ""
-"No need to copy over the method of <code>spiral()</code>, the turtle of this "
-"exercise already knows it."
+"If you discover a cool figure, don't forget to send your parameters (menu "
+"Help/feedback) so that we can add it to the list!"
 msgstr ""
-"Pas besoin de recopier le code de <code>spiral()</code>, la tortue de cet "
-"exercice connait déjà la méthode."
+"Si vous découvrez une figure sympa n'oubliez pas de nous envoyer vos "
+"paramètres (menu Aide/envoyer une anomalie) pour que nous puissions "
+"l'ajouter à la liste!"
 
 #. type: Content of: <h2>
 #: src/lessons/recursion/dragoncurve/DragonCurve1.html:1
@@ -9338,16 +9403,14 @@ msgstr ""
 msgid "Tower of Hanoi"
 msgstr "Les tours de Hanoï"
 
-#. type: Content of: outside any tag (error?)
+#. type: Content of: <p>
 #: src/lessons/recursion/hanoi/HanoiBoard.html:3
 msgid ""
-"The Tower of Hanoi or Towers of Hanoi , also called the Tower of Brahma or "
+"The Tower of Hanoi or Towers of Hanoi, also called the Tower of Brahma or "
 "Towers of Brahma, is a mathematical game or puzzle. It consists of three "
-"rods, and a number of disks of different sizes which can slide onto any rod. "
+"pegs, and a number of disks of different sizes which can slide onto any peg. "
 "The puzzle starts with the disks in a neat stack in ascending order of size "
-"on one rod, the smallest at the top, thus forming a pyramid.  The objective "
-"of the puzzle is to move the entire stack to another rod, obeying the "
-"following rules:"
+"on one peg, the smallest at the top, thus forming a pyramid."
 msgstr ""
 "La tour de Hanoï, ou les tours de Hanoï, aussi appelé la Tour de Brahma ou "
 "les tours de Brahma, est un jeu ou puzzle mathématique. Il consiste en trois "
@@ -9357,6 +9420,15 @@ msgstr ""
 "une tour, formant donc une pyramide. L'objectif du puzzle est de déplacer la "
 "pile entière jusqu'à une autre tour, en respectant les règles suivantes :"
 
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/hanoi/HanoiBoard.html:9
+msgid ""
+"The objective of the puzzle is to move the entire stack to another peg, "
+"obeying the following rules:"
+msgstr ""
+"Le but de ce puzzle est de déplacer tous les disques de la pile vers un "
+"autre piquet en respectant les règles suivantes :"
+
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/hanoi/HanoiBoard.html:11
 msgid "Only one disk may be moved at a time."
@@ -9365,9 +9437,9 @@ msgstr "Seul un disque peut être bougé à la fois."
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/hanoi/HanoiBoard.html:13
 msgid ""
-"Each move consists of taking the upper disk from one of the rods and sliding "
-"it onto another rod, on top of the other disks that may already be present "
-"on that rod."
+"Each move consists of taking the upper disk from one of the pegs and sliding "
+"it onto another peg, on top of the other disks that may already be present "
+"on that peg."
 msgstr ""
 "Chaque mouvement consiste à prendre le disque supérieur de l'une des tours "
 "et à le déposer sur une autre tour, au sommet des autres disques qui peuvent "
@@ -9382,67 +9454,92 @@ msgstr "Aucun disque ne peut être placé au dessus d'un disque plus petit."
 #: src/lessons/recursion/hanoi/HanoiBoard.html:22
 msgid ""
 "Write the core of the method: <code>[!java]void [/!]solve([!java]int "
-"[/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!], [!java]int "
-"[/!]height[!scala]:Int[/!])</code> This method will recursively solve the "
-"presented problem. First parameter named <code>src</code> is the index of "
-"the initial tower, second parameter <code>dst</code> is the index of the "
-"expected final tower, and the third parameter <code>height</code> is the "
-"height of the tower.  A key to solving this puzzle is to recognize that it "
-"can be solved by breaking the problem down into a collection of smaller "
-"problems and further breaking those problems down into even smaller problems "
-"until a solution is reached.  The following procedure demonstrates this "
-"approach:"
-msgstr ""
-"Écrivez le coeur de la méthode <code>[!java]void [/!]solve([!java]int "
-"[/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!], [!java]int "
-"[/!]height[!scala]:Int[/!])</code>. Cette méthode résoudra de manière "
-"récursibe le problème. Le premier paramètre, nommé <code>src</code>, est "
-"l'index de la tour initiale, le second paramètre  <code>dst</code> est "
-"l'index de la tour final souhaitée, et le troisième paramètre <code>height</"
-"code> est la taille de la tour. La clé pour résoudre de puzzle est de "
-"reconnaitre qu'il peut être résolu en cassant le problème en un ensemble de "
-"problèmes de plus petites tailles et de continuer cette réduction de la "
-"taille du problème jusqu'à atteindre une solution. La procédure suivante "
-"démontre cette approche :"
+"[/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!],[!java]int "
+"[/!]other[!scala]:Int[/!], [!java]int [/!]height[!scala]:Int[/!])</code>"
+msgstr ""
+"Write the core of the method: <code>[!java]void [/!]solve([!java]int "
+"[/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!],[!java]int "
+"[/!]autre[!scala]:Int[/!], [!java]int [/!]hauteur[!scala]:Int[/!])</code>"
 
-#. type: Content of: <ul><li>
+#. type: Content of: <p>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:25
+msgid ""
+"This method will recursively solve the presented problem. The first "
+"parameter named <code>src</code> is the index of the initial tower, the "
+"second parameter <code>dst</code> is the index of the expected final tower, "
+"the third parameter <code>other</code> is the index of the unused peg while "
+"the fourth parameter <code>height</code> is the height of the tower."
+msgstr ""
+"Cette méthode résout récursivement le problème. \n"
+"Le premier paramètre (nommé <code>src</code>) est l'index de la pile "
+"initiale.\n"
+"Le second paramètre (nommé <code>dst</code>) est l'index du piquet vers "
+"lequel la pile dont être déplacée.\n"
+"Le troisième paramètre (nommé <code>other</code>) est l'index du piquet "
+"inutilisé, tandis que le quatrième paramètre (nommé <code>hauteur</code>) "
+"est la taille de la pile à déplacer."
+
+#. type: Content of: <p>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:31
+msgid ""
+"A key to solving this puzzle is to recognize that it can be solved by "
+"breaking the problem down into a collection of smaller problems and further "
+"breaking those problems down into even smaller problems until a solution is "
+"reached."
+msgstr ""
+"La clé pour résoudre de puzzle est de reconnaitre qu'il peut être résolu en "
+"cassant le problème en un ensemble de problèmes de plus petites tailles et "
+"de continuer cette réduction de la taille du problème jusqu'à atteindre une "
+"solution."
+
+#. type: Attribute 'alt' of: <div>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:35
+msgid "I don't get it, please give me some extra indications"
+msgstr "Je suis perdu, je voudrais plus d'indications"
+
+#. type: Content of: <div>
 #: src/lessons/recursion/hanoi/HanoiBoard.html:36
+msgid "Here is the pseudo-code of the solution:"
+msgstr "Voici le pseudo-code de la solution :"
+
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:38
 msgid "label the pegs A, B, C (these labels may move at different steps)"
 msgstr ""
 "Etiquetons les tours A, B, C ( ces étiquettes peuvent changer à différentes "
 "étapes )"
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:37
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:39
 msgid "let n be the total number of discs (the height of the initial tower)"
 msgstr "Soit n le nombre total de disques ( la hauteur de la tour initiale )"
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:38
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:40
 msgid "number the discs from 1 (smallest, topmost) to n (largest, bottommost)"
 msgstr ""
 "Numérotez les disques de 1 ( le plus petit, le plus en haut ) à n ( le plus "
 "large, le plus en bas )"
 
-#. type: Content of: outside any tag (error?)
-#: src/lessons/recursion/hanoi/HanoiBoard.html:41
+#. type: Content of: <div>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:43
 msgid "To move n discs from peg A to peg C:"
 msgstr "Pour déplacer n disques du poteau A au poteau C : "
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:43
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:45
 msgid "move n−1 discs from A to B. This leaves disc number n alone on peg A"
 msgstr ""
 "déplacer n-1 disques de A vers B. Cela laisse le disque numéro n seul sur le "
 "poteau A"
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:44
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:46
 msgid "move disc number n from A to C"
 msgstr "déplacer le disque numéro n de A vers C"
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:45
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:47
 msgid "move n−1 discs from B to C so they sit on disc number n"
 msgstr ""
 "deplacer n-1 disques de B vers C afin qu'ils reposent sur le disque numéro n"
@@ -10186,10 +10283,10 @@ msgid ""
 "on the cell that is located below (respectively at the right of) the current "
 "cell."
 msgstr ""
-"Il est bon de noter qu'il n'est pas possible de construire un mur sur la "
-"côté inférieur ou droit d'une case. Néanmoins, quand de tels murs existent, "
-"cela signifie qu'il a été construit sur une case voisine -- comme mur "
-"supérieur (respectivement gauche) sur la case qui est située en dessous "
+"Il est bon de noter qu'il n'est pas possible de construire un mur sur le "
+"côté inférieur ou le coté droit d'une case. Néanmoins, quand de tels murs "
+"existent, cela signifie qu'il a été construit sur une case voisine -- comme "
+"mur supérieur (respectivement gauche) sur la case qui est située en dessous "
 "(respectivement sur à droite) de la case courante."
 
 #. type: Content of: <p>
@@ -12812,7 +12909,7 @@ msgstr ""
 "une valeur, suivie de cette valeur plus 5, suivie par cette valeur moins "
 "1. \n"
 "Par exemple, 2,7,1 est un tel motif car 7=5+2 et 1=2-1. 3,8,2 est un autre "
-"motif correspondant.\n"
+"motif correspondant."
 
 #. type: Content of: <p>
 #: src/lessons/welcome/array/has271/Has271.html:6
@@ -12896,7 +12993,7 @@ msgstr ""
 #: src/lessons/sort/pancake/universe/PancakeWorld.html:17
 #, no-wrap
 msgid "[!java]boolean [/!]isSorted()   [!scala]:Boolean[/!]"
-msgstr "[!java]boolean [/!]estTrie()   [!scala]:Boolean[/!]"
+msgstr "[!java]boolean [/!]estTriee()   [!scala]:Boolean[/!]"
 
 #. type: Content of: outside any tag (error?)
 #: src/lessons/sort/pancake/universe/PancakeWorld.html:18
diff --git a/lib/l10n/plm.pot b/lib/l10n/plm.pot
index eb1466d..c8a969b 100644
--- a/lib/l10n/plm.pot
+++ b/lib/l10n/plm.pot
@@ -7,7 +7,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2013-09-12 21:41+0300\n"
+"POT-Creation-Date: 2013-09-30 12:10+0300\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -389,7 +389,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/plm/universe/sort/SortingWorld.html:47 src/lessons/sort/bubble/AlgBubbleSort1.html:18
+#: src/plm/universe/sort/SortingWorld.html:47 src/lessons/sort/basic/bubble/AlgBubbleSort1.html:18
 msgid ""
 "The history view is a bit hairly at the first glance, but actually rather "
 "simple: The time flows from left to right on this graph, and each row is a "
@@ -586,8 +586,8 @@ msgstr ""
 msgid "Returns the current pen position as a boolean."
 msgstr ""
 
-#. type: Content of: <table><tr><td>
-#: src/plm/universe/turtles/TurtleWorld.html:57 src/plm/universe/bugglequest/BuggleWorld.html:25
+#. type: Content of: <pre>
+#: src/plm/universe/turtles/TurtleWorld.html:57
 #, no-wrap
 msgid "[!java]Color [/!]getColor()[!scala]:Color[/!]"
 msgstr ""
@@ -624,6 +624,91 @@ msgstr ""
 msgid "Returns whether the current turtle is selected in the graphical interface."
 msgstr ""
 
+#. type: Content of: <h2>
+#: src/plm/universe/turtles/TurtleWorld.html:68 src/plm/universe/bugglequest/BuggleWorld.html:65
+msgid "Valid colors"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:70 src/plm/universe/bugglequest/BuggleWorld.html:67
+msgid "Name"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:70 src/plm/universe/bugglequest/BuggleWorld.html:67
+msgid "Color"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:71 src/plm/universe/bugglequest/BuggleWorld.html:68
+msgid "Color.black"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:71 src/plm/universe/turtles/TurtleWorld.html:72 src/plm/universe/turtles/TurtleWorld.html:73 src/plm/universe/turtles/TurtleWorld.html:74 src/plm/universe/turtles/TurtleWorld.html:75 src/plm/universe/turtles/TurtleWorld.html:76 src/plm/universe/turtles/TurtleWorld.html:77 src/plm/universe/turtles/TurtleWorld.html:78 src/plm/universe/turtles/TurtleWorld.html:79 src/plm/universe/turtles/TurtleWorld.html:80 src/plm/universe/turtles/TurtleWorld.ht [...]
+msgid " "
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:72 src/plm/universe/bugglequest/BuggleWorld.html:69
+msgid "Color.blue"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:73 src/plm/universe/bugglequest/BuggleWorld.html:70
+msgid "Color.cyan"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:74 src/plm/universe/bugglequest/BuggleWorld.html:71
+msgid "Color.darkGray"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:75 src/plm/universe/bugglequest/BuggleWorld.html:72
+msgid "Color.gray"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:76 src/plm/universe/bugglequest/BuggleWorld.html:73
+msgid "Color.green"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:77 src/plm/universe/bugglequest/BuggleWorld.html:74
+msgid "Color.lightGray"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:78 src/plm/universe/bugglequest/BuggleWorld.html:75
+msgid "Color.magenta"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:79 src/plm/universe/bugglequest/BuggleWorld.html:76
+msgid "Color.orange"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:80 src/plm/universe/bugglequest/BuggleWorld.html:77
+msgid "Color.pink"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:81 src/plm/universe/bugglequest/BuggleWorld.html:78
+msgid "Color.red"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:82 src/plm/universe/bugglequest/BuggleWorld.html:79
+msgid "Color.white"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/turtles/TurtleWorld.html:83 src/plm/universe/bugglequest/BuggleWorld.html:80
+msgid "Color.yellow"
+msgstr ""
+
 #. type: Content of: <h1>
 #: src/plm/universe/bugglequest/BuggleWorld.html:1
 msgid "BuggleWorld"
@@ -766,17 +851,22 @@ msgstr ""
 
 #. type: Content of: <table><tr><td><b>
 #: src/plm/universe/bugglequest/BuggleWorld.html:24
-msgid "<b>Get the color"
+msgid "<b>Get the color of the body"
 msgstr ""
 
 #. type: Content of: <table><tr><td>
 #: src/plm/universe/bugglequest/BuggleWorld.html:24
-msgid "Set the color</b>"
+msgid "Set the color of the body</b>"
+msgstr ""
+
+#. type: Content of: <table><tr><td>
+#: src/plm/universe/bugglequest/BuggleWorld.html:25
+msgid "[!java]Color [/!]getBodyColor()[!scala]:Color[/!]"
 msgstr ""
 
 #. type: Content of: <table><tr><td>
 #: src/plm/universe/bugglequest/BuggleWorld.html:26
-msgid "[!java]void [/!]setColor([!java]Color [/!]c[!scala]:Color[/!])"
+msgid "[!java]void [/!]setBodyColor([!java]Color [/!]c[!scala]:Color[/!])"
 msgstr ""
 
 #. type: Content of: <table><tr><td><b>
@@ -949,11 +1039,6 @@ msgstr ""
 msgid "[!java]void [/!]dropBaggle()"
 msgstr ""
 
-#. type: Content of: <table><tr><td>
-#: src/plm/universe/bugglequest/BuggleWorld.html:56 src/lessons/welcome/Main.html:8 src/lessons/welcome/Main.html:91 src/lessons/welcome/Main.html:174 src/lessons/welcome/Main.html:254 src/lessons/welcome/Main.html:348 src/lessons/welcome/Main.html:428 src/lessons/welcome/Main.html:468
-msgid " "
-msgstr ""
-
 #. type: Content of: <table><tr><td><b>
 #: src/plm/universe/bugglequest/BuggleWorld.html:58
 msgid "<b>Look for a message"
@@ -995,12 +1080,12 @@ msgid "[!java]void [/!]clearMessage()"
 msgstr ""
 
 #. type: Content of: <h2>
-#: src/plm/universe/bugglequest/BuggleWorld.html:65
+#: src/plm/universe/bugglequest/BuggleWorld.html:83
 msgid "Note on exceptions"
 msgstr ""
 
 #. type: Content of: outside any tag (error?)
-#: src/plm/universe/bugglequest/BuggleWorld.html:66
+#: src/plm/universe/bugglequest/BuggleWorld.html:84
 msgid ""
 "Regular buggles throw a BuggleWallException exception if you ask them to "
 "traverse a wall.  They throw a NoBaggleUnderBuggleException exception if you "
@@ -1012,7 +1097,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/plm/universe/bugglequest/BuggleWorld.html:73
+#: src/plm/universe/bugglequest/BuggleWorld.html:91
 msgid ""
 "SimpleBuggles (ie, the one used in first exercises) display an error message "
 "on problem so that you don't need to know what an exception is."
@@ -1658,7 +1743,7 @@ msgid "meltTheChocolatePieces(); addSugar(); coolMix(); serve()\n"
 msgstr ""
 
 #. type: Content of: <p><p><p>
-#: src/lessons/welcome/instructions/Instructions.html:34 src/lessons/welcome/variables/Variables.html:77 src/lessons/welcome/variables/Variables.html:146 src/lessons/welcome/loopfor/LoopFor.html:69 src/lessons/welcome/loopdowhile/LoopDoWhile.html:53 src/lessons/welcome/loopdowhile/Poucet.html:36 src/lessons/welcome/methods/args/MethodsArgs.html:65 src/lessons/welcome/methods/picture/MethodsPicture.html:39 src/lessons/welcome/bdr/BDR.html:59 src/lessons/welcome/bdr/BDR.html:193 src/lesson [...]
+#: src/lessons/welcome/instructions/Instructions.html:34 src/lessons/welcome/variables/Variables.html:77 src/lessons/welcome/variables/Variables.html:146 src/lessons/welcome/loopfor/LoopFor.html:69 src/lessons/welcome/loopdowhile/LoopDoWhile.html:53 src/lessons/welcome/loopdowhile/Poucet.html:36 src/lessons/welcome/methods/args/MethodsArgs.html:65 src/lessons/welcome/methods/picture/MethodsPicture.html:39 src/lessons/welcome/bdr/BDR.html:59 src/lessons/welcome/bdr/BDR.html:193 src/lesson [...]
 msgid "[/!]"
 msgstr ""
 
@@ -5615,12 +5700,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h3>
-#: src/lessons/sort/Main.html:1 src/lessons/sort/short_desc.html:1
+#: src/lessons/sort/basic/Main.html:1 src/lessons/sort/basic/short_desc.html:1
 msgid "Sorting Algorithms"
 msgstr ""
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/sort/Main.html:3
+#: src/lessons/sort/basic/Main.html:3
 msgid ""
 "This lesson allows to experiment with some classical sorting algorithms (and "
 "some less common variant of them). The goal is two fold: you can first "
@@ -5631,7 +5716,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/Main.html:10
+#: src/lessons/sort/basic/Main.html:10
 msgid ""
 "More exercises are planned for the future, on recursive sorting algorithms "
 "(such as QuickSort and MergeSort) or using other microworlds to apply these "
@@ -5639,24 +5724,24 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/short_desc.html:3
+#: src/lessons/sort/basic/short_desc.html:3
 msgid ""
 "This lesson allows to experiment with some classical sorting algorithms (and "
 "some less common variant of them :)"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/short_desc.html:6 src/lessons/recursion/short_desc.html:5 src/lessons/maze/short_desc.html:5
+#: src/lessons/sort/basic/short_desc.html:6 src/lessons/recursion/short_desc.html:5 src/lessons/maze/short_desc.html:5
 msgid "You are supposed to master the bases of programming to take this lesson."
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:1
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:1
 msgid "BubbleSort"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:3
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:3
 msgid ""
 "Welcome to the sorting universe. It allows you to experiment with the "
 "existing sorting algorithms. The list of buildins that you can use in your "
@@ -5665,7 +5750,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:7
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:7
 msgid ""
 "It is not enough to sort the array to pass the exercises. Your solution must "
 "strictly follow the expected behavior of each exercise. This is enforced by "
@@ -5674,7 +5759,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:12
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:12
 msgid ""
 "When your algorithm diverges from the expectation, understanding the "
 "difference between your code and the expected solution can reveal very "
@@ -5685,12 +5770,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h2>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:27
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:27
 msgid "First attempt at BubbleSort"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:29
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:29
 msgid ""
 "This first sorting algorithm is the most simple one: Bubble sort consists in "
 "progressively moving up the smaller elements of the array, as if they were "
@@ -5705,17 +5790,17 @@ msgid ""
 msgstr ""
 
 #. type: Attribute 'alt' of: <div>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:39 src/lessons/sort/bubble/AlgBubbleSort2.html:11
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:39 src/lessons/sort/basic/bubble/AlgBubbleSort2.html:11
 msgid "Show Tip (Pseudo-code)"
 msgstr ""
 
 #. type: Content of: <div><p>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:40
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:40
 msgid "The pseudo-code of the BubbleSort algorithm is the following:"
 msgstr ""
 
 #. type: Content of: <div><pre>
-#: src/lessons/sort/bubble/AlgBubbleSort1.html:41
+#: src/lessons/sort/basic/bubble/AlgBubbleSort1.html:41
 #, no-wrap
 msgid ""
 "do: \n"
@@ -5725,12 +5810,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:1
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:1
 msgid "BubbleSort (take 2)"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:3
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:3
 msgid ""
 "If you look carefully at the behavior of BubbleSort, a first easy "
 "optimization appears: after one traversal, the last element of the array "
@@ -5742,12 +5827,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <div><p>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:12
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:12
 msgid "The pseudo-code of the BubbleSort2 algorithm is the following:"
 msgstr ""
 
 #. type: Content of: <div><pre>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:13
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:13
 #, no-wrap
 msgid ""
 "For all i in [len-2,0] (traversing from biggest to smallest)\n"
@@ -5756,7 +5841,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:19
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:19
 msgid ""
 "When we run this algorithm, it is quite disappointing to see that it runs "
 "approximately at the same speed than the basic version of BubbleSort. This "
@@ -5769,7 +5854,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort2.html:28
+#: src/lessons/sort/basic/bubble/AlgBubbleSort2.html:28
 msgid ""
 "From the asymptotic complexity point of view, there is absolutely no "
 "difference: this variation is still in O(n^2) on average (our gain is only "
@@ -5777,12 +5862,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:1
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:1
 msgid "BubbleSort (take 3)"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:3
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:3
 msgid ""
 "Let's now reintroduce the little optimization we removed at previous step: "
 "if a traversal does not swap any element, it means that the array is already "
@@ -5790,20 +5875,22 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:7
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:8
 msgid ""
-"For that, simply use the <code>break</code> keyword, which breaks the "
-"current loop.  Beware, if you have several embedded loops, this will apply "
-"to the internal one."
+"[!java|python]For that, simply use the <code>break</code> keyword, which "
+"breaks the current loop.  Beware, if you have several embedded loops, this "
+"will apply to the internal one.[/!] [!scala]For that, simply quit the "
+"current function by calling <code>return</code> with no associated "
+"value.[/!]"
 msgstr ""
 
 #. type: Attribute 'alt' of: <div>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:10
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:13
 msgid "If you want, this tip shows the pseudo-code."
 msgstr ""
 
 #. type: Content of: <div><pre>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:12
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:15
 #, no-wrap
 msgid ""
 "For all i in [len-2,0] (traversing from biggest to smallest)\n"
@@ -5813,19 +5900,19 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/bubble/AlgBubbleSort3.html:19
+#: src/lessons/sort/basic/bubble/AlgBubbleSort3.html:22
 msgid ""
 "This optimization is even more disappointing: it only provide a gain of a "
 "few percents on the amount of reads over BubbleSort2."
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:1
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:1
 msgid "CocktailSort"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:3
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:3
 msgid ""
 "To improve further the BubbleSort algorithm, we need to look closer its "
 "behavior. One can notice that big elements are moved very quickly in "
@@ -5835,7 +5922,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:9
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:9
 msgid ""
 "To help the turtles moving faster, the cocktail sort traverse alternatively "
 "the array from right to left and from left to right. Here is the "
@@ -5843,7 +5930,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <pre>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:14
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:14
 #, no-wrap
 msgid ""
 "Do\n"
@@ -5855,7 +5942,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort1.html:22
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort1.html:22
 msgid ""
 "One can see that cocktail sort achieves exactly the same amount of swaps "
 "than the bubble sort, but improves slightly on read amount. It is however "
@@ -5863,12 +5950,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/cocktail/AlgCocktailSort2.html:1
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:1
 msgid "CocktailSort (take 2)"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort2.html:3
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:3
 msgid ""
 "We will now apply to CocktailSort the same optimization than BubbleSort2 did "
 "to BubbleSort. We must remember the limits of the array part not being "
@@ -5877,27 +5964,27 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <pre>
-#: src/lessons/sort/cocktail/AlgCocktailSort2.html:8
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort2.html:8
 #, no-wrap
 msgid ""
 "beg=0; end=len-2\n"
 "do\n"
 "  For all Pour i in [beg,end], do:\n"
 "      If cells i and i+1 must be swapped, do it    \n"
-"  end--\n"
+"  end -= 1 (this means end = end - 1)\n"
 "  For all Pour i in [beg,end] (downwards), do:\n"
 "      If cells i and i+1 must be swapped, do it    \n"
-"  beg++\n"
+"  beg += 1 (this means beg = beg + 1)\n"
 "while at least one of the traversal swapped an element\n"
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/cocktail/AlgCocktailSort3.html:1
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort3.html:1
 msgid "CocktailSort (take 3)"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/cocktail/AlgCocktailSort3.html:3
+#: src/lessons/sort/basic/cocktail/AlgCocktailSort3.html:3
 msgid ""
 "Even if the asymptotic complexity of CocktailSort2 is the same than the one "
 "of BubbleSort, it seem to perform better in practice. It is even possible to "
@@ -5908,12 +5995,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:1
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:1
 msgid "InsertionSort"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:4
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:4
 msgid ""
 "This sorting algorithm is quite simple to understand and write, even if it "
 "is not as efficient as possible. Its asymptotic complexity is in O(n2), but "
@@ -5922,7 +6009,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:9
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:9
 msgid ""
 "The idea is to traverse all elements of the array, and to insert each of "
 "them into its proper position in the already sorted part of the array. When "
@@ -5932,38 +6019,38 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:17
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:17
 msgid "Once this is done, the situation is the following:"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:21
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:21
 msgid "The pseudo-code of this algorithm is thus the following:"
 msgstr ""
 
 #. type: Content of: <pre>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:22
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:22
 #, no-wrap
 msgid ""
-"For each i in [1,len]\n"
-"  store the value of i in a variable val\n"
-"  copy the cell i-1 into i if i-1 contains a value bigger than val\n"
-"  copy the cell i-2 into i-1 if i-2 contains a value bigger than val\n"
-"  copy the cell i-3 into i-2 if i-3 contains a value bigger than val\n"
-"  copy the cell i-4 into i-3 if i-4 contains a value bigger than val\n"
+"For each i in [1,len-1]\n"
+"  store the value of i in a variable v\n"
+"  copy the cell i-1 into i if i-1 contains a value bigger than v\n"
+"  copy the cell i-2 into i-1 if i-2 contains a value bigger than v\n"
+"  copy the cell i-3 into i-2 if i-3 contains a value bigger than v\n"
+"  copy the cell i-4 into i-3 if i-4 contains a value bigger than v\n"
 "  ...\n"
-"  copy val into the last cell copied above\n"
+"  copy v into the last cell copied above\n"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:32
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:32
 msgid ""
 "Naturally, you should use a loop to write the big permutation within the "
 "given loop. Writing it this way would be really ... counter-productive."
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:35
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:35
 msgid ""
 "If you've always wondered what computer science researchers do nowadays, "
 "here is part of the answer: They improve fundamental algorithms so that "
@@ -5971,12 +6058,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h2>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:39
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:39
 msgid "Other variation of insertion sort"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:41
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:41
 msgid ""
 "TreeSort builds a binary search tree to sort them. It leads to a O(n log(n))  "
 "on average, but O(n^2) in worst cases. We won't study this algorithm here "
@@ -5985,7 +6072,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:46
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:46
 msgid ""
 "There is other variations over the insertion sort, such as PatienceSort "
 "which builds piles of values and sort each pile afterward. This algorithm "
@@ -5996,19 +6083,19 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/insertion/AlgInsertionSort.html:53
+#: src/lessons/sort/basic/insertion/AlgInsertionSort.html:53
 msgid ""
 "Wikipedia provides a detailled description of all these algorithms we cannot "
 "present here because of time constraints."
 msgstr ""
 
 #. type: Content of: <h2>
-#: src/lessons/sort/shell/AlgShellSort.html:1
+#: src/lessons/sort/basic/shell/AlgShellSort.html:1
 msgid "ShellSort"
 msgstr ""
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/sort/shell/AlgShellSort.html:3
+#: src/lessons/sort/basic/shell/AlgShellSort.html:3
 msgid ""
 "This algorithm is named after its author, Donald Shell, who published it in "
 "1959. It can be seen as an application of the CombSort idea (let elements "
@@ -6023,14 +6110,14 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/shell/AlgShellSort.html:14
+#: src/lessons/sort/basic/shell/AlgShellSort.html:14
 msgid ""
 "Donald Shell propose <code>len/2</code> as initial value of the gap, and "
 "then to divide it by 2 at each step. The pseudo-code is thus the following:"
 msgstr ""
 
 #. type: Content of: <p><pre>
-#: src/lessons/sort/shell/AlgShellSort.html:17
+#: src/lessons/sort/basic/shell/AlgShellSort.html:17
 #, no-wrap
 msgid ""
 "gap=len/2\n"
@@ -6040,7 +6127,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/shell/AlgShellSort.html:22
+#: src/lessons/sort/basic/shell/AlgShellSort.html:22
 msgid ""
 "Just like in CombSort, the sequence of values taken by the gap is crucial "
 "for Shell sort performance. In some rare pathological cases, the sequence we "
@@ -6054,7 +6141,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/shell/AlgShellSort.html:32
+#: src/lessons/sort/basic/shell/AlgShellSort.html:32
 msgid ""
 "In our case, the array are ways too small to benefit of these "
 "optimizations. If you ever need to do so, take as initial gap the biggest "
@@ -6063,7 +6150,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/shell/AlgShellSort.html:37
+#: src/lessons/sort/basic/shell/AlgShellSort.html:37
 msgid ""
 "Interestingly enough, determining the best gap sequence for shell sort turns "
 "into a research issue of our century in computer science. For example, an "
@@ -6075,19 +6162,19 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/selection/AlgSelectionSort.html:1
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:1
 msgid "Selection Sort"
 msgstr ""
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/sort/selection/AlgSelectionSort.html:3
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:3
 msgid ""
 "In this exercise we will implement another classical algorithm: selection "
 "sort."
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/selection/AlgSelectionSort.html:6
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:6
 msgid ""
 "The idea is simply to select for each cell of the array the smallest value "
 "from the part not already sorted. Thus for the first cell, it takes the "
@@ -6097,7 +6184,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/selection/AlgSelectionSort.html:12
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:12
 msgid ""
 "More generally, for the cell N, it looks the cell M in [n;len] containing "
 "the smallest possible value of the interval. Then, it swaps the content of "
@@ -6105,12 +6192,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p><p><h2>
-#: src/lessons/sort/selection/AlgSelectionSort.html:16
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:16
 msgid "Existing variations"
 msgstr ""
 
 #. type: Content of: <p><p>
-#: src/lessons/sort/selection/AlgSelectionSort.html:17
+#: src/lessons/sort/basic/selection/AlgSelectionSort.html:17
 msgid ""
 "Another classical algorithm which idea is based on the selection of good "
 "elements is HeapSort, but it uses a heap data structure which we did not see "
@@ -6119,12 +6206,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/comb/AlgCombSort.html:1
+#: src/lessons/sort/basic/comb/AlgCombSort.html:1
 msgid "CombSort"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort.html:3
+#: src/lessons/sort/basic/comb/AlgCombSort.html:3
 msgid ""
 "We saw that CocktailSort improve a bit for turtles (i.e. small values near "
 "to the end of the array), but it is still possible to achieve "
@@ -6139,7 +6226,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <pre>
-#: src/lessons/sort/comb/AlgCombSort.html:15
+#: src/lessons/sort/basic/comb/AlgCombSort.html:15
 #, no-wrap
 msgid ""
 "gap = len;\n"
@@ -6149,44 +6236,59 @@ msgid ""
 "   i = O\n"
 "   while i+gap < len do:\n"
 "     if i and i+gap must be swapped, do it\n"
-"     increase i by the gap\n"
+"     increase i by one\n"
 "while the gap is bigger than 1 or the last traversal swapped at least one "
 "pair\n"
 msgstr ""
 
 #. type: Content of: outside any tag (error?)
-#: src/lessons/sort/comb/AlgCombSort.html:26 src/lessons/maze/island/IslandMaze.html:66 src/lessons/welcome/bat/bool1/Max1020.html:5
+#: src/lessons/sort/basic/comb/AlgCombSort.html:26 src/lessons/maze/island/IslandMaze.html:66 src/lessons/welcome/bat/bool1/Max1020.html:5
 msgid "[!scala]"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort.html:26
+#: src/lessons/sort/basic/comb/AlgCombSort.html:26
 msgid ""
-"One tricky part is that we want to divide gap, that is an integer, by 1.3, "
-"that is a double.  The type system of scala won't let us do this, because "
-"such discrepency usually denotes a programmer error.  As this is not an "
-"error this time, we have to convert gap to Double for the time of the "
-"operation, and then convert the result back to Int to store it into "
+"One tricky part is that we want to divide gap, that is an integer (of type "
+"Int), by 1.3, that is a Double.  The type system of scala won't let us do "
+"this, because such discrepancy usually denotes a programmer error.  As this "
+"is not an error this time, we have to convert gap to Double for the time of "
+"the operation, and then convert the result back to Int to store it into "
 "gap. This should be written this way:"
 msgstr ""
 
 #. type: Content of: <pre>
-#: src/lessons/sort/comb/AlgCombSort.html:30
+#: src/lessons/sort/basic/comb/AlgCombSort.html:30
 #, no-wrap
 msgid "gap = (gap.asInstanceOf[Double] / 1.3).asInstanceOf[Int]"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort.html:31
+#: src/lessons/sort/basic/comb/AlgCombSort.html:31
 msgid ""
 "This is rather verbose, but actually, this notation is not very complex. And "
 "remember that the type checker is your friend. It's picky and sometimes "
 "annoying (as on this one), but it often catches weird bugs that would have "
-"been a pain to debug if not catched by the type checker."
+"been a pain to debug if not catch by the type checker. And since the Scala's "
+"authors are pragmatic, the previous expression can be simplified:"
+msgstr ""
+
+#. type: Content of: <pre>
+#: src/lessons/sort/basic/comb/AlgCombSort.html:35
+#, no-wrap
+msgid "gap = (gap.toDouble / 1.3).toInt"
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/sort/basic/comb/AlgCombSort.html:36
+msgid ""
+"<code>toDouble</code> and <code>toInt</code> are just shortcuts for the "
+"corresponding expressions <code>asInstanceOf[Double]</code> and "
+"<code>asInstanceOf[Int]</code>. It's not very generic, but it's very handy."
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort.html:36
+#: src/lessons/sort/basic/comb/AlgCombSort.html:40
 msgid ""
 "This algorithm was invented by Wlodek Dobosiewicz in 1980, and later "
 "rediscovered and popularized by Stephen Lacey and Richard Box, who described "
@@ -6194,12 +6296,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/comb/AlgCombSort11.html:1
+#: src/lessons/sort/basic/comb/AlgCombSort11.html:1
 msgid "CombSort11"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/comb/AlgCombSort11.html:3
+#: src/lessons/sort/basic/comb/AlgCombSort11.html:3
 msgid ""
 "The authors of this algorithm observed that the performance is increased if "
 "we make sure that the last values of the gap are (11, 8, 6, 4, 3, 2, 1)  "
@@ -6209,12 +6311,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <h1>
-#: src/lessons/sort/gnome/AlgGnomeSort.html:1
+#: src/lessons/sort/basic/gnome/AlgGnomeSort.html:1
 msgid "GnomeSort"
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/gnome/AlgGnomeSort.html:3
+#: src/lessons/sort/basic/gnome/AlgGnomeSort.html:3
 msgid ""
 "The Gnome sort is similar to insertion sort, but the elements are moved in "
 "position by a serie of swaps just like in bubble sort. It is named after the "
@@ -6223,7 +6325,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/sort/gnome/AlgGnomeSort.html:8
+#: src/lessons/sort/basic/gnome/AlgGnomeSort.html:8
 msgid ""
 "Gnome Sort is based on the technique used by the standard Dutch Garden Gnome "
 "(Du.: tuinkabouter). Here is how a garden gnome sorts a line of flower "
@@ -6343,7 +6445,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p><p><p><h2>
-#: src/lessons/recursion/square/FourSquare.html:47 src/lessons/recursion/circle/Circle.html:14 src/lessons/recursion/hanoi/HanoiBoard.html:20 src/lessons/welcome/array/basics/Array1.html:229
+#: src/lessons/recursion/square/FourSquare.html:47 src/lessons/recursion/hanoi/HanoiBoard.html:20 src/lessons/welcome/array/basics/Array1.html:229
 msgid "Goal of this exercise"
 msgstr ""
 
@@ -6386,7 +6488,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/recursion/polygonfractal/PolygonFractal.html:7 src/lessons/recursion/sierpinski/Sierpinski.html:8 src/lessons/recursion/dragoncurve/DragonCurve1.html:25 src/lessons/recursion/dragoncurve/DragonCurve2.html:44
+#: src/lessons/recursion/polygonfractal/PolygonFractal.html:7 src/lessons/recursion/dragoncurve/DragonCurve1.html:25 src/lessons/recursion/dragoncurve/DragonCurve2.html:44
 msgid ""
 "Have a look at each world's objective view to understand how to write the "
 "function."
@@ -6401,101 +6503,26 @@ msgstr ""
 #: src/lessons/recursion/koch/Koch.html:3
 msgid ""
 "We will now draw snow flakes using the Koch fractal. A fractal is a "
-"geometrical pattern repeated at every scale."
+"geometric pattern repeated at every scale."
 msgstr ""
 
 #. type: Content of: <p>
 #: src/lessons/recursion/koch/Koch.html:6
 msgid ""
-"The general form is a triangle, with each side given by a serie of recursive "
-"calls. The general form is given by something like this:"
-msgstr ""
-
-#. type: Content of: <p><pre>
-#: src/lessons/recursion/koch/Koch.html:8
-#, no-wrap
-msgid ""
-"[!java]void [/!]snowFlake ([!java]int [/!]levels[!scala]:Int[/!], "
-"[!java]double [/!]length[!scala]:Double[/!])[!python]:[/!][!java|scala] "
-"{[/!]\n"
-"   snowSide(levels, length);\n"
-"   right(120);\n"
-"   snowSide(levels, length);\n"
-"   right(120);\n"
-"   snowSide(levels, length);\n"
-"   right(120);\n"
-"[!java|scala]}[/!]"
+"The general form is a triangle, with each side given by several recursive "
+"calls. Your work is only to write the code of the <code>snowSide</code> "
+"method so that it draws one side of the triangle. To make it easier, each "
+"sides are represented in a specific color. Just draw the red things (without "
+"changing your pen color), and the other colors will be drawn automatically."
 msgstr ""
 
-#. type: Content of: <p><p>
-#: src/lessons/recursion/koch/Koch.html:17
+#. type: Content of: <p>
+#: src/lessons/recursion/koch/Koch.html:12
 msgid ""
 "Observe the drawing in each world's objective to understand the pattern's "
 "logic, and then reproduce it. You must write the <code>snowSide()</code> "
-"method, which is recursive."
-msgstr ""
-
-#. type: Content of: <h2>
-#: src/lessons/recursion/star/Star.html:1
-msgid "Turtles in the stars"
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/recursion/star/Star.html:3
-msgid ""
-"This is the last hand-on turtles exercise before recursion. The goal is to "
-"draw three 5-branches stars. Like any regular stars with N branches, the "
-"angle at each external corners are 360/N degrees while the angles between "
-"branches are of 2*360/N degrees."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/recursion/star/Star.html:8
-msgid ""
-"The first star to draw is black (<code>Color.black</code>) and its branches "
-"are 100 steps long. The second is blue (<code>Color.blue</code>) and its "
-"branches are 80 steps long. It's shifted of 45 degrees from the first "
-"one. The last star is red (<code>Color.red</code>), its branches are 60 "
-"steps long and it's shifted of 45 degrees from the previous one."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/recursion/star/Star.html:14
-msgid "Observe the world's objective to visualize the picture to draw."
-msgstr ""
-
-#. type: Content of: <h2>
-#: src/lessons/recursion/circle/Circle.html:1
-msgid "Three little circles"
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/recursion/circle/Circle.html:3
-msgid ""
-"As we saw (and as you can check in the documentation of this world under "
-"\"About this world\"), turtles can only draw straight lines. Despite of "
-"this, the goal of this world is to draw circles... This can be achived "
-"simply by realizing that a circle can be seen as a concatenation of very "
-"little segments."
-msgstr ""
-
-#. type: Content of: <p>
-#: src/lessons/recursion/circle/Circle.html:9
-msgid ""
-"Differential calculus would even argue that a circle is the asymptotical "
-"limit of such construct when the size of each segment becomes infinitely "
-"small while their amount becomes infinitely large, but you can definitely "
-"solve this exercise without understanding differential calculus :)"
-msgstr ""
-
-#. type: Content of: outside any tag (error?)
-#: src/lessons/recursion/circle/Circle.html:16
-msgid ""
-"Write a function drawing a circle, taking the size of each of the 360 "
-"segments as parameter. Then use it in your code to draw the whole picture.  "
-"The first circle is obtained with segments of size 0.5, the second with "
-"segments of size 1 and the last one with 1.5-long segments.  Once again, "
-"this is a warming exercise, no recursion is needed."
+"method, which is recursive but <b>do not call snowFlake from snowSide</b>, "
+"or you will get very strange unexpected behaviors."
 msgstr ""
 
 #. type: Content of: <h2>
@@ -6503,7 +6530,7 @@ msgstr ""
 msgid "Trees"
 msgstr ""
 
-#. type: Content of: outside any tag (error?)
+#. type: Content of: <p>
 #: src/lessons/recursion/tree/Tree.html:3
 msgid ""
 "We will now draw trees. For that, we will write a method using double "
@@ -6525,16 +6552,40 @@ msgid ""
 "To draw a tree of four levels, you have to draw a trunk of the given length, "
 "turn right of the given angle, draw a tree of level 3, turn left twice of "
 "the given angle, draw another tree of level 3, and come back to your initial "
-"location."
+"location. Don't forget to come back to the initial location!"
 msgstr ""
 
-#. type: Content of: <p><p>
+#. type: Content of: <p><p><p>
 #: src/lessons/recursion/tree/Tree.html:12
 msgid ""
 "If a tree's trunk is of length 'len', the trunk of the next level tree will "
 "be of length 'len*shrink'."
 msgstr ""
 
+#. type: Content of: <p><p><p><p><p>
+#: src/lessons/recursion/tree/Tree.html:15
+msgid ""
+"As you can see, each recursion level is represented by a distinctive "
+"color. For that, you have to call the <code>current(step)</code>, passing "
+"the current recursion level as a parameter. This will pick the right color "
+"for you.  Don't erase your great colors when you move back to your initial "
+"location."
+msgstr ""
+
+#. type: Content of: <p><p><p><p><p>
+#: src/lessons/recursion/tree/Tree.html:19
+msgid ""
+"If you get your function wrong, this can easily become hairly to debug as "
+"your errors will appear at each level of the recursion, completely changing "
+"the drawing.  For debugging purpose, you can use the <code>subtree()</code> "
+"that will draw a correct subtree. This function is then very similar to the "
+"one you are trying to write. The only difference is that "
+"<code>subtree()</code> only draws in black. So, you can use it instead of a "
+"recursive call to debug your code, but you have to change for a proper "
+"recursive call to your own code (once it works)  to get the colors right, "
+"and pass the exercise."
+msgstr ""
+
 #. type: Content of: <h2>
 #: src/lessons/recursion/sierpinski/Sierpinski.html:1
 msgid "Sierpinski's Triangle"
@@ -6544,8 +6595,8 @@ msgstr ""
 #: src/lessons/recursion/sierpinski/Sierpinski.html:3
 msgid ""
 "The fractal we will now draw is formed of a big triangle inside which "
-"several smaller triangles are embeeded. The prototype of the fuction to draw "
-"it is the following:"
+"several smaller triangles are embedded. The prototype of the function to "
+"draw it is the following:"
 msgstr ""
 
 #. type: Content of: <pre>
@@ -6556,6 +6607,15 @@ msgid ""
 "[!java]double [/!]length[!scala]:Double[/!])"
 msgstr ""
 
+#. type: Content of: <p>
+#: src/lessons/recursion/sierpinski/Sierpinski.html:8
+msgid ""
+"Have a look at each world's objective view to understand how to write the "
+"function.  To draw one side of the triangle, draw a smaller recursive "
+"triangle (halve the length) and move forward by the requested length.  "
+"Globally, you have to draw 3 such sides and turn by 120 between each side."
+msgstr ""
+
 #. type: Content of: <h2>
 #: src/lessons/recursion/spiral/Spiral.html:1
 msgid "Spirals"
@@ -6612,65 +6672,31 @@ msgstr ""
 msgid "Drawing spirals"
 msgstr ""
 
-#. type: Content of: outside any tag (error?)
+#. type: Content of: <p>
 #: src/lessons/recursion/spiral/SpiralUse.html:3
 msgid ""
-"Can you reproduce the provided patterns of this exercise using the "
-"<code>spiral()</code> method?"
+"This exercise is not really an exercise in that sense that you just have to "
+"click on the Execute button to get the reward: All the needed code is "
+"already provided. Instead, you can here explore the possibilities of the "
+"code you just wrote by changing the parameters of the call to the "
+"<code>spiral</code> function. You can move on to the next exercise if you "
+"are short on time, and come back later to play around."
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/recursion/spiral/SpiralUse.html:6
+#: src/lessons/recursion/spiral/SpiralUse.html:9
 msgid ""
-"You must provide a method called <code>doit(page)</code> taking the page "
-"number to draw as parameter. Its code is as following, with A0, B0, etc "
-"being integers.  The goal of this exercise is to find the good values for "
-"each page, which requires to correctly understand how the spiral method "
-"works."
-msgstr ""
-
-#. type: Content of: <pre>
-#: src/lessons/recursion/spiral/SpiralUse.html:12
-#, no-wrap
-msgid ""
-"[!java]void [/!]doit([!java]int "
-"[/!]page[!scala]:Int[/!])[!python]:[/!][!java|scala] {[/!]\n"
-"  [!java]switch (page) {[/!][!scala]page match {[/!][!python]  # select on "
-"the value of page[/!]\n"
-"    [!java]case 0:[/!][!scala]case 0 =>[/!][!python]if page==0:[/!] <span "
-"class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the first "
-"page, dubbed \"One\"</span>\n"
-"      spiral(A0,B0,C0,D0);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 1:[/!][!scala]case 1 =>[/!][!python]if page==1:[/!] <span "
-"class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the second "
-"page, dubbed \"Two\"</span>\n"
-"      spiral(A1,B1,C1,D1);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 2:[/!][!scala]case 2 =>[/!][!python]if page==2:[/!] <span "
-"class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the page "
-"dubbed \"Three\"</span> \n"
-"      spiral(A2,B2,C2,D2);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 3:[/!][!scala]case 3 =>[/!][!python]if page==3:[/!] <span "
-"class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the page "
-"dubbed \"Four\"</span> \n"
-"      spiral(A3,B3,C3,D3);\n"
-"[!java]      break;[/!]\n"
-"    [!java]case 4:[/!][!scala]case 4 =>[/!][!python]if page==4:[/!] <span "
-"class=\"Comment\">[!java|scala]//[/!][!python]#[/!] Drawing of the page "
-"dubbed \"Five\"</span>\n"
-"      spiral(A4,B4,C4,D4);[!java|scala]\n"
-"[!java]      break;[/!]\n"
-"  }\n"
-"}[/!]"
+"Here are some of the figures that you can produce with your "
+"<code>Spiral</code> function, provided that you come with the right "
+"parameters. You can switch to the creative mode (from the Session menu)  to "
+"disable the world comparison when you explore with these spirals."
 msgstr ""
 
 #. type: Content of: <p>
-#: src/lessons/recursion/spiral/SpiralUse.html:33
+#: src/lessons/recursion/spiral/SpiralUse.html:18
 msgid ""
-"No need to copy over the method of <code>spiral()</code>, the turtle of this "
-"exercise already knows it."
+"If you discover a cool figure, don't forget to send your parameters (menu "
+"Help/feedback) so that we can add it to the list!"
 msgstr ""
 
 #. type: Content of: <h2>
@@ -6849,16 +6875,21 @@ msgstr ""
 msgid "Tower of Hanoi"
 msgstr ""
 
-#. type: Content of: outside any tag (error?)
+#. type: Content of: <p>
 #: src/lessons/recursion/hanoi/HanoiBoard.html:3
 msgid ""
-"The Tower of Hanoi or Towers of Hanoi , also called the Tower of Brahma or "
+"The Tower of Hanoi or Towers of Hanoi, also called the Tower of Brahma or "
 "Towers of Brahma, is a mathematical game or puzzle. It consists of three "
-"rods, and a number of disks of different sizes which can slide onto any "
-"rod. The puzzle starts with the disks in a neat stack in ascending order of "
-"size on one rod, the smallest at the top, thus forming a pyramid.  The "
-"objective of the puzzle is to move the entire stack to another rod, obeying "
-"the following rules:"
+"pegs, and a number of disks of different sizes which can slide onto any "
+"peg. The puzzle starts with the disks in a neat stack in ascending order of "
+"size on one peg, the smallest at the top, thus forming a pyramid."
+msgstr ""
+
+#. type: Content of: outside any tag (error?)
+#: src/lessons/recursion/hanoi/HanoiBoard.html:9
+msgid ""
+"The objective of the puzzle is to move the entire stack to another peg, "
+"obeying the following rules:"
 msgstr ""
 
 #. type: Content of: <ul><li>
@@ -6869,9 +6900,9 @@ msgstr ""
 #. type: Content of: <ul><li>
 #: src/lessons/recursion/hanoi/HanoiBoard.html:13
 msgid ""
-"Each move consists of taking the upper disk from one of the rods and sliding "
-"it onto another rod, on top of the other disks that may already be present "
-"on that rod."
+"Each move consists of taking the upper disk from one of the pegs and sliding "
+"it onto another peg, on top of the other disks that may already be present "
+"on that peg."
 msgstr ""
 
 #. type: Content of: <ul><li>
@@ -6883,50 +6914,71 @@ msgstr ""
 #: src/lessons/recursion/hanoi/HanoiBoard.html:22
 msgid ""
 "Write the core of the method: <code>[!java]void [/!]solve([!java]int "
-"[/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!], [!java]int "
-"[/!]height[!scala]:Int[/!])</code> This method will recursively solve the "
-"presented problem. First parameter named <code>src</code> is the index of "
-"the initial tower, second parameter <code>dst</code> is the index of the "
-"expected final tower, and the third parameter <code>height</code> is the "
-"height of the tower.  A key to solving this puzzle is to recognize that it "
-"can be solved by breaking the problem down into a collection of smaller "
-"problems and further breaking those problems down into even smaller problems "
-"until a solution is reached.  The following procedure demonstrates this "
-"approach:"
+"[/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!],[!java]int "
+"[/!]other[!scala]:Int[/!], [!java]int [/!]height[!scala]:Int[/!])</code>"
 msgstr ""
 
-#. type: Content of: <ul><li>
+#. type: Content of: <p>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:25
+msgid ""
+"This method will recursively solve the presented problem. The first "
+"parameter named <code>src</code> is the index of the initial tower, the "
+"second parameter <code>dst</code> is the index of the expected final tower, "
+"the third parameter <code>other</code> is the index of the unused peg while "
+"the fourth parameter <code>height</code> is the height of the tower."
+msgstr ""
+
+#. type: Content of: <p>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:31
+msgid ""
+"A key to solving this puzzle is to recognize that it can be solved by "
+"breaking the problem down into a collection of smaller problems and further "
+"breaking those problems down into even smaller problems until a solution is "
+"reached."
+msgstr ""
+
+#. type: Attribute 'alt' of: <div>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:35
+msgid "I don't get it, please give me some extra indications"
+msgstr ""
+
+#. type: Content of: <div>
 #: src/lessons/recursion/hanoi/HanoiBoard.html:36
+msgid "Here is the pseudo-code of the solution:"
+msgstr ""
+
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:38
 msgid "label the pegs A, B, C (these labels may move at different steps)"
 msgstr ""
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:37
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:39
 msgid "let n be the total number of discs (the height of the initial tower)"
 msgstr ""
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:38
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:40
 msgid "number the discs from 1 (smallest, topmost) to n (largest, bottommost)"
 msgstr ""
 
-#. type: Content of: outside any tag (error?)
-#: src/lessons/recursion/hanoi/HanoiBoard.html:41
+#. type: Content of: <div>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:43
 msgid "To move n discs from peg A to peg C:"
 msgstr ""
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:43
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:45
 msgid "move n−1 discs from A to B. This leaves disc number n alone on peg A"
 msgstr ""
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:44
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:46
 msgid "move disc number n from A to C"
 msgstr ""
 
-#. type: Content of: <ul><li>
-#: src/lessons/recursion/hanoi/HanoiBoard.html:45
+#. type: Content of: <div><ul><li>
+#: src/lessons/recursion/hanoi/HanoiBoard.html:47
 msgid "move n−1 discs from B to C so they sit on disc number n"
 msgstr ""
 
diff --git a/lib/langtools-beta.jar b/lib/langtools-beta.jar
new file mode 100644
index 0000000..5b064ec
Binary files /dev/null and b/lib/langtools-beta.jar differ
diff --git a/lib/miglayout-3.7.4.jar b/lib/miglayout-3.7.4.jar
new file mode 100644
index 0000000..27befc2
Binary files /dev/null and b/lib/miglayout-3.7.4.jar differ
diff --git a/lib/resources/plm.configuration.properties b/lib/resources/plm.configuration.properties
index 5b80454..c41b551 100644
--- a/lib/resources/plm.configuration.properties
+++ b/lib/resources/plm.configuration.properties
@@ -1,7 +1,7 @@
-#Thu, 12 Sep 2013 21:46:18 +0200
+#Mon, 16 Sep 2013 22:13:15 +0200
 # PLM default configuration
-plm.major.version=2.2.3
-plm.minor.version=20130912
+plm.major.version=2.2.7
+plm.minor.version=20130930
 
 # This should be self explanatory, actually
 # Its value is automatically updated and saved in the personal property file
diff --git a/lib/scala/scala-compiler-2.10.2.jar b/lib/scala/scala-compiler-2.10.2.jar
new file mode 100644
index 0000000..fe4ed11
Binary files /dev/null and b/lib/scala/scala-compiler-2.10.2.jar differ
diff --git a/lib/scala/scala-library-2.10.2.jar b/lib/scala/scala-library-2.10.2.jar
new file mode 100644
index 0000000..765bd71
Binary files /dev/null and b/lib/scala/scala-library-2.10.2.jar differ
diff --git a/lib/scala/scala-reflect-2.10.2.jar b/lib/scala/scala-reflect-2.10.2.jar
new file mode 100644
index 0000000..91c9c48
Binary files /dev/null and b/lib/scala/scala-reflect-2.10.2.jar differ
diff --git a/lib/twitter4j-core-3.0.3.jar b/lib/twitter4j-core-3.0.3.jar
new file mode 100644
index 0000000..b9394f4
Binary files /dev/null and b/lib/twitter4j-core-3.0.3.jar differ
diff --git a/po4a.conf b/po4a.conf
index 473507d..db48932 100644
--- a/po4a.conf
+++ b/po4a.conf
@@ -68,28 +68,26 @@
 [type: html] src/lessons/turmites/turmitecreator/TurmiteCreator.html	$lang:src/lessons/turmites/turmitecreator/TurmiteCreator.$lang.html
 [type: html] src/lessons/turmites/universe/TurmiteWorld.html        	$lang:src/lessons/turmites/universe/TurmiteWorld.$lang.html
 
-[type: html] src/lessons/sort/Main.html				$lang:src/lessons/sort/Main.$lang.html
-[type: html] src/lessons/sort/short_desc.html			$lang:src/lessons/sort/short_desc.$lang.html
-[type: html] src/lessons/sort/bubble/AlgBubbleSort1.html	$lang:src/lessons/sort/bubble/AlgBubbleSort1.$lang.html
-[type: html] src/lessons/sort/bubble/AlgBubbleSort2.html	$lang:src/lessons/sort/bubble/AlgBubbleSort2.$lang.html
-[type: html] src/lessons/sort/bubble/AlgBubbleSort3.html	$lang:src/lessons/sort/bubble/AlgBubbleSort3.$lang.html
-[type: html] src/lessons/sort/cocktail/AlgCocktailSort1.html	$lang:src/lessons/sort/cocktail/AlgCocktailSort1.$lang.html
-[type: html] src/lessons/sort/cocktail/AlgCocktailSort2.html	$lang:src/lessons/sort/cocktail/AlgCocktailSort2.$lang.html
-[type: html] src/lessons/sort/cocktail/AlgCocktailSort3.html	$lang:src/lessons/sort/cocktail/AlgCocktailSort3.$lang.html
-[type: html] src/lessons/sort/insertion/AlgInsertionSort.html	$lang:src/lessons/sort/insertion/AlgInsertionSort.$lang.html
-[type: html] src/lessons/sort/shell/AlgShellSort.html	$lang:src/lessons/sort/shell/AlgShellSort.$lang.html
-[type: html] src/lessons/sort/selection/AlgSelectionSort.html	$lang:src/lessons/sort/selection/AlgSelectionSort.$lang.html
-[type: html] src/lessons/sort/comb/AlgCombSort.html	$lang:src/lessons/sort/comb/AlgCombSort.$lang.html
-[type: html] src/lessons/sort/comb/AlgCombSort11.html	$lang:src/lessons/sort/comb/AlgCombSort11.$lang.html
-[type: html] src/lessons/sort/gnome/AlgGnomeSort.html	$lang:src/lessons/sort/gnome/AlgGnomeSort.$lang.html
+[type: html] src/lessons/sort/basic/Main.html				$lang:src/lessons/sort/basic/Main.$lang.html
+[type: html] src/lessons/sort/basic/short_desc.html			$lang:src/lessons/sort/basic/short_desc.$lang.html
+[type: html] src/lessons/sort/basic/bubble/AlgBubbleSort1.html	$lang:src/lessons/sort/basic/bubble/AlgBubbleSort1.$lang.html
+[type: html] src/lessons/sort/basic/bubble/AlgBubbleSort2.html	$lang:src/lessons/sort/basic/bubble/AlgBubbleSort2.$lang.html
+[type: html] src/lessons/sort/basic/bubble/AlgBubbleSort3.html	$lang:src/lessons/sort/basic/bubble/AlgBubbleSort3.$lang.html
+[type: html] src/lessons/sort/basic/cocktail/AlgCocktailSort1.html	$lang:src/lessons/sort/basic/cocktail/AlgCocktailSort1.$lang.html
+[type: html] src/lessons/sort/basic/cocktail/AlgCocktailSort2.html	$lang:src/lessons/sort/basic/cocktail/AlgCocktailSort2.$lang.html
+[type: html] src/lessons/sort/basic/cocktail/AlgCocktailSort3.html	$lang:src/lessons/sort/basic/cocktail/AlgCocktailSort3.$lang.html
+[type: html] src/lessons/sort/basic/insertion/AlgInsertionSort.html	$lang:src/lessons/sort/basic/insertion/AlgInsertionSort.$lang.html
+[type: html] src/lessons/sort/basic/shell/AlgShellSort.html	$lang:src/lessons/sort/basic/shell/AlgShellSort.$lang.html
+[type: html] src/lessons/sort/basic/selection/AlgSelectionSort.html	$lang:src/lessons/sort/basic/selection/AlgSelectionSort.$lang.html
+[type: html] src/lessons/sort/basic/comb/AlgCombSort.html	$lang:src/lessons/sort/basic/comb/AlgCombSort.$lang.html
+[type: html] src/lessons/sort/basic/comb/AlgCombSort11.html	$lang:src/lessons/sort/basic/comb/AlgCombSort11.$lang.html
+[type: html] src/lessons/sort/basic/gnome/AlgGnomeSort.html	$lang:src/lessons/sort/basic/gnome/AlgGnomeSort.$lang.html
 
 [type: html] src/lessons/recursion/Main.html			$lang:src/lessons/recursion/Main.$lang.html
 [type: html] src/lessons/recursion/short_desc.html		$lang:src/lessons/recursion/short_desc.$lang.html
 [type: html] src/lessons/recursion/square/FourSquare.html		$lang:src/lessons/recursion/square/FourSquare.$lang.html
 [type: html] src/lessons/recursion/polygonfractal/PolygonFractal.html	$lang:src/lessons/recursion/polygonfractal/PolygonFractal.$lang.html
 [type: html] src/lessons/recursion/koch/Koch.html		$lang:src/lessons/recursion/koch/Koch.$lang.html
-[type: html] src/lessons/recursion/star/Star.html		$lang:src/lessons/recursion/star/Star.$lang.html
-[type: html] src/lessons/recursion/circle/Circle.html		$lang:src/lessons/recursion/circle/Circle.$lang.html
 [type: html] src/lessons/recursion/tree/Tree.html		$lang:src/lessons/recursion/tree/Tree.$lang.html
 [type: html] src/lessons/recursion/sierpinski/Sierpinski.html	$lang:src/lessons/recursion/sierpinski/Sierpinski.$lang.html
 [type: html] src/lessons/recursion/spiral/Spiral.html		$lang:src/lessons/recursion/spiral/Spiral.$lang.html
diff --git a/src/lessons/maze/shortestpath/ShortestPathMaze.fr.html b/src/lessons/maze/shortestpath/ShortestPathMaze.fr.html
index 96d0afe..e5cd817 100644
--- a/src/lessons/maze/shortestpath/ShortestPathMaze.fr.html
+++ b/src/lessons/maze/shortestpath/ShortestPathMaze.fr.html
@@ -23,10 +23,10 @@ trouve dans la cellule (x,y) (ou bien la valeur 9999 s'il n'y a pas
 d'indication à l'endroit indiqué).</li>  
 </ul>
 
-<p>Il est bon de noter qu'il n'est pas possible de construire un mur sur la
-côté inférieur ou droit d'une case. Néanmoins, quand de tels murs existent,
-cela signifie qu'il a été construit sur une case voisine -- comme mur
-supérieur (respectivement gauche) sur la case qui est située en dessous
+<p>Il est bon de noter qu'il n'est pas possible de construire un mur sur le
+côté inférieur ou le coté droit d'une case. Néanmoins, quand de tels murs
+existent, cela signifie qu'il a été construit sur une case voisine -- comme
+mur supérieur (respectivement gauche) sur la case qui est située en dessous
 (respectivement sur à droite) de la case courante.</p>
 
 <h3>Objectif de cet exercice</h3>
diff --git a/src/lessons/recursion/Main.java b/src/lessons/recursion/Main.java
index 04e2eed..a754c7f 100644
--- a/src/lessons/recursion/Main.java
+++ b/src/lessons/recursion/Main.java
@@ -1,7 +1,5 @@
 package lessons.recursion;
 
-import plm.core.model.lesson.Lesson;
-import lessons.recursion.circle.Circle;
 import lessons.recursion.dragoncurve.DragonCurve1;
 import lessons.recursion.dragoncurve.DragonCurve2;
 import lessons.recursion.koch.Koch;
@@ -10,15 +8,13 @@ import lessons.recursion.sierpinski.Sierpinski;
 import lessons.recursion.spiral.Spiral;
 import lessons.recursion.spiral.SpiralUse;
 import lessons.recursion.square.FourSquare;
-import lessons.recursion.star.Star;
 import lessons.recursion.tree.Tree;
+import plm.core.model.lesson.Lesson;
 
 public class Main extends Lesson {
 	@Override
 	protected void loadExercises() {
 		addExercise(new FourSquare(this));
-		addExercise(new Circle(this));
-		addExercise(new Star(this));
 		addExercise(new Spiral(this));
 		addExercise(new SpiralUse(this));
 		addExercise(new Tree(this));
diff --git a/src/lessons/recursion/circle/Circle.fr.html b/src/lessons/recursion/circle/Circle.fr.html
deleted file mode 100644
index 566a09f..0000000
--- a/src/lessons/recursion/circle/Circle.fr.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<h2>Trois petits cercles</h2>
-
-Comme nous l'avons vu (et comme vous pouvez le vérifier en consultant l'aide
-de ce monde dans le menu "À propos de ce monde"), les tortues ne savent que
-se déplacer en ligne droite. Et pourtant, l'objectif de cet exercice est de
-leur faire dessiner des cercles... On peut pourtant résoudre ce problème
-simplement en réalisant qu'un cercle peut être représenté comme une
-concaténation de petits segments.
-
-<p>Les amateurs de calcul différentiel diraient même sans doute qu'un cercle
-est la limite asymptotique d'une telle construction quand la taille des
-segments tend vers zéro alors que leur nombre tend vers l'infini, mais il
-est tout à fait possible de réussir cet exercice sans maîtriser le calcul
-différentiel :)</p>
-
-<h3>Objectif de l'exercice</h3> 
-
-Écrivez une fonction dessinant un cercle, avec la taille de chacun des 360
-pas passée en paramètre. Utilisez la ensuite dans votre code pour réaliser
-la figure dans son ensemble. Le premier cercle s'obtient avec des pas de
-0.5, le second avec des pas de 1 et le troisième avec des pas de 1.5. Encore
-une fois, il s'agit d'un exercice de prise en main, et aucune récursion
-n'est nécessaire.
-
diff --git a/src/lessons/recursion/circle/Circle.html b/src/lessons/recursion/circle/Circle.html
deleted file mode 100644
index 370432a..0000000
--- a/src/lessons/recursion/circle/Circle.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<h2>Three little circles</h2>
-
-As we saw (and as you can check in the documentation of this world under
-"About this world"), turtles can only draw straight lines. Despite of this,
-the goal of this world is to draw circles... This can be achived simply by
-realizing that a circle can be seen as a concatenation of very little
-segments.
-
-<p>Differential calculus would even argue that a circle is the asymptotical
-limit of such construct when the size of each segment becomes infinitely
-small while their amount becomes infinitely large, but you can definitely 
-solve this exercise without understanding differential calculus :)</p>
-
-<h3>Goal of this exercise</h3> 
-
-Write a function drawing a circle, taking the size of each of the 360
-segments as parameter. Then use it in your code to draw the whole picture. 
-The first circle is obtained with segments of size 0.5, the second with 
-segments of size 1 and the last one with 1.5-long segments. 
-Once again, this is a warming exercise, no recursion is needed.
-
diff --git a/src/lessons/recursion/circle/Circle.java b/src/lessons/recursion/circle/Circle.java
deleted file mode 100644
index a210028..0000000
--- a/src/lessons/recursion/circle/Circle.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package lessons.recursion.circle;
-
-import plm.core.model.lesson.ExerciseTemplated;
-import plm.core.model.lesson.Lesson;
-import plm.universe.World;
-import plm.universe.turtles.Turtle;
-import plm.universe.turtles.TurtleWorld;
-
-public class Circle extends ExerciseTemplated {
-
-	public Circle(Lesson lesson) {
-		super(lesson);
-
-		/* Create initial situation */
-		World myWorld = new TurtleWorld("WhiteBoard", 400, 400);
-
-		new Turtle(myWorld, "Caretta", 200, 200);
-		setup(myWorld);
-	}
-}
diff --git a/src/lessons/recursion/circle/CircleEntity.java b/src/lessons/recursion/circle/CircleEntity.java
deleted file mode 100644
index dffe6e1..0000000
--- a/src/lessons/recursion/circle/CircleEntity.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package lessons.recursion.circle;
-
-import plm.universe.turtles.Turtle;
-
-public class CircleEntity extends Turtle {
-
-	/* BEGIN TEMPLATE */
-	public void run() {
-		/* BEGIN SOLUTION */
-		circle(0.5);
-		circle(1);
-		circle(1.5);
-	}
-	public void circle(double step) {
-		for (int i=0;i<360;i++) {
-			forward(step);
-			right(1);
-		}		
-		/* END SOLUTION */
-	}
-	/* END TEMPLATE */
-}
diff --git a/src/lessons/recursion/circle/CircleEntity.py b/src/lessons/recursion/circle/CircleEntity.py
deleted file mode 100644
index 7f69230..0000000
--- a/src/lessons/recursion/circle/CircleEntity.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# BEGIN SOLUTION 
-def circle(step):
-  for i in range(360):
-    forward(step)
-    right(1)
-
-circle(0.5)
-circle(1)
-circle(1.5)
-# END SOLUTION
diff --git a/src/lessons/recursion/circle/CircleEntity.scala b/src/lessons/recursion/circle/CircleEntity.scala
deleted file mode 100644
index d3c772a..0000000
--- a/src/lessons/recursion/circle/CircleEntity.scala
+++ /dev/null
@@ -1,22 +0,0 @@
-package lessons.recursion.circle;
-
-import plm.universe.turtles.Turtle;
-
-class ScalaCircleEntity extends Turtle {
-
-	/* BEGIN TEMPLATE */
-	override def run() {
-		/* BEGIN SOLUTION */
-		circle(0.5);
-		circle(1);
-		circle(1.5);
-	}
-	override def circle(step:Double) {
-		for (i <- 1 to 360) {
-			forward(step);
-			right(1);
-		}		
-		/* END SOLUTION */
-	}
-	/* END TEMPLATE */
-}
diff --git a/src/lessons/recursion/dragoncurve/DragonCurve1Entity.java b/src/lessons/recursion/dragoncurve/DragonCurve1Entity.java
index dd70e91..666d344 100644
--- a/src/lessons/recursion/dragoncurve/DragonCurve1Entity.java
+++ b/src/lessons/recursion/dragoncurve/DragonCurve1Entity.java
@@ -5,18 +5,18 @@ import plm.universe.turtles.Turtle;
 public class DragonCurve1Entity extends Turtle {
 
 	/* BEGIN TEMPLATE */
-	public void dragon(int ordre, double x, double y, double z, double t) {
+	public void dragon(int order, double x, double y, double z, double t) {
 		/* BEGIN SOLUTION */
 		double u, v;
 
-		if (ordre == 1) {
+		if (order == 1) {
 			setPos(x, y);
 			moveTo(z, t);
 		} else {
 			u = (x + z + t - y) / 2;
 			v = (y + t - z + x) / 2;
-			dragon(ordre - 1, x, y, u, v);
-			dragon(ordre - 1, z, t, u, v);
+			dragon(order - 1, x, y, u, v);
+			dragon(order - 1, z, t, u, v);
 		}
 		/* END SOLUTION */
 	}
diff --git a/src/lessons/recursion/dragoncurve/DragonCurve1Entity.py b/src/lessons/recursion/dragoncurve/DragonCurve1Entity.py
index 09fa4e7..f5a5c45 100644
--- a/src/lessons/recursion/dragoncurve/DragonCurve1Entity.py
+++ b/src/lessons/recursion/dragoncurve/DragonCurve1Entity.py
@@ -1,14 +1,14 @@
 # BEGIN TEMPLATE
-def dragon(ordre, x, y, z, t):
+def dragon(order, x, y, z, t):
   # BEGIN SOLUTION 
-    if ordre == 1:
+    if order == 1:
       setPos(x, y)
       moveTo(z, t)
     else:
       u = (x + z + t - y) / 2
       v = (y + t - z + x) / 2;
-      dragon(ordre - 1, x, y, u, v)
-      dragon(ordre - 1, z, t, u, v)
+      dragon(order - 1, x, y, u, v)
+      dragon(order - 1, z, t, u, v)
 # END SOLUTION
 # END TEMPLATE
 
diff --git a/src/lessons/recursion/dragoncurve/DragonCurve1Entity.scala b/src/lessons/recursion/dragoncurve/DragonCurve1Entity.scala
index d19e7f6..28f6817 100644
--- a/src/lessons/recursion/dragoncurve/DragonCurve1Entity.scala
+++ b/src/lessons/recursion/dragoncurve/DragonCurve1Entity.scala
@@ -5,16 +5,16 @@ import plm.universe.turtles.Turtle;
 class ScalaDragonCurve1Entity extends Turtle {
 
 	/* BEGIN TEMPLATE */
-	def dragon(ordre:Int, x:Double, y:Double, z:Double, t:Double) {
+	def dragon(order:Int, x:Double, y:Double, z:Double, t:Double) {
 		/* BEGIN SOLUTION */
-		if (ordre == 1) {
+		if (order == 1) {
 			setPos(x, y);
 			moveTo(z, t);
 		} else {
 			val u = (x + z + t - y) / 2;
 			val v = (y + t - z + x) / 2;
-			dragon(ordre - 1, x, y, u, v);
-			dragon(ordre - 1, z, t, u, v);
+			dragon(order - 1, x, y, u, v);
+			dragon(order - 1, z, t, u, v);
 		}
 		/* END SOLUTION */
 	}
diff --git a/src/lessons/recursion/dragoncurve/DragonCurve2Entity.java b/src/lessons/recursion/dragoncurve/DragonCurve2Entity.java
index ab46056..6e36ec6 100644
--- a/src/lessons/recursion/dragoncurve/DragonCurve2Entity.java
+++ b/src/lessons/recursion/dragoncurve/DragonCurve2Entity.java
@@ -7,34 +7,34 @@ import plm.universe.turtles.Turtle;
 public class DragonCurve2Entity extends Turtle {
 
 	/* BEGIN TEMPLATE */
-	public void dragon(int ordre, double x, double y, double z, double t) {
+	public void dragon(int order, double x, double y, double z, double t) {
 		/* BEGIN HIDDEN */
 		double u, v;
 
-		if (ordre == 1) {
+		if (order == 1) {
 			setColor(Color.red);
 			moveTo(z, t);
 		} else {
 			u = (x + z + t - y) / 2;
 			v = (y + t - z + x) / 2;
-			dragon(ordre - 1, x, y, u, v);
-			dragonInverse(ordre - 1, u, v, z, t);
+			dragon(order - 1, x, y, u, v);
+			dragonInverse(order - 1, u, v, z, t);
 		}
 		/* END HIDDEN */
 	}
 
-	public void dragonInverse(int ordre, double x, double y, double z, double t) {
+	public void dragonInverse(int order, double x, double y, double z, double t) {
 		/* BEGIN HIDDEN */
 		double u, v;
 
-		if (ordre == 1) {
+		if (order == 1) {
 			setColor(Color.blue);
 			moveTo(z, t);
 		} else {
 			u = (x + z - t + y) / 2;
 			v = (y + t + z - x) / 2;
-			dragon(ordre - 1, x, y, u, v);
-			dragonInverse(ordre - 1, u, v, z, t);
+			dragon(order - 1, x, y, u, v);
+			dragonInverse(order - 1, u, v, z, t);
 		}
 		/* END HIDDEN */
 	}
diff --git a/src/lessons/recursion/dragoncurve/DragonCurve2Entity.py b/src/lessons/recursion/dragoncurve/DragonCurve2Entity.py
index 37e1ea9..466187a 100644
--- a/src/lessons/recursion/dragoncurve/DragonCurve2Entity.py
+++ b/src/lessons/recursion/dragoncurve/DragonCurve2Entity.py
@@ -1,26 +1,26 @@
 # BEGIN TEMPLATE
-def dragon(ordre, x, y, z, t):
+def dragon(order, x, y, z, t):
   # BEGIN HIDDEN
-  if (ordre == 1):
+  if (order == 1):
     setColor(Color.red)
     moveTo(z, t)
   else:
     u = (x + z + t - y) / 2
     v = (y + t - z + x) / 2
-    dragon(ordre - 1, x, y, u, v)
-    dragonInverse(ordre - 1, u, v, z, t)
+    dragon(order - 1, x, y, u, v)
+    dragonInverse(order - 1, u, v, z, t)
   # END HIDDEN
 
-def dragonInverse(ordre, x, y, z, t):
+def dragonInverse(order, x, y, z, t):
   # BEGIN HIDDEN
-  if (ordre == 1):
+  if (order == 1):
     setColor(Color.blue)
     moveTo(z, t)
   else:
     u = (x + z - t + y) / 2;
     v = (y + t + z - x) / 2;
-    dragon(ordre - 1, x, y, u, v);
-    dragonInverse(ordre - 1, u, v, z, t);
+    dragon(order - 1, x, y, u, v);
+    dragonInverse(order - 1, u, v, z, t);
   # END HIDDEN
 # END TEMPLATE
 
diff --git a/src/lessons/recursion/hanoi/HanoiBoard.fr.html b/src/lessons/recursion/hanoi/HanoiBoard.fr.html
index 459c0d7..5adff64 100644
--- a/src/lessons/recursion/hanoi/HanoiBoard.fr.html
+++ b/src/lessons/recursion/hanoi/HanoiBoard.fr.html
@@ -1,12 +1,15 @@
 <h2>Les tours de Hanoï</h2>
 
-La tour de Hanoï, ou les tours de Hanoï, aussi appelé la Tour de Brahma ou
+<p>La tour de Hanoï, ou les tours de Hanoï, aussi appelé la Tour de Brahma ou
 les tours de Brahma, est un jeu ou puzzle mathématique. Il consiste en trois
 tours, et un nombre de disques de différentes tailles qui peuvent glisser
 sur n'importe quelle tour. Le puzzle commence avec tous les disques en une
 belle pile selon l'ordre croissant de la taille, le plus petit en haut, sur
 une tour, formant donc une pyramide. L'objectif du puzzle est de déplacer la
-pile entière jusqu'à une autre tour, en respectant les règles suivantes :
+pile entière jusqu'à une autre tour, en respectant les règles suivantes :</p>
+
+Le but de ce puzzle est de déplacer tous les disques de la pile vers un
+autre piquet en respectant les règles suivantes :
 <ul>
   <li>Seul un disque peut être bougé à la fois.</li>
 
@@ -19,17 +22,26 @@ déjà être présents sur cette tour.</li>
 
 <h3>Objectif de l'exercice</h3> 
 
-Écrivez le coeur de la méthode <code>[!java]void [/!]solve([!java]int
-[/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!], [!java]int
-[/!]height[!scala]:Int[/!])</code>. Cette méthode résoudra de manière
-récursibe le problème. Le premier paramètre, nommé <code>src</code>, est
-l'index de la tour initiale, le second paramètre  <code>dst</code> est
-l'index de la tour final souhaitée, et le troisième paramètre
-<code>height</code> est la taille de la tour. La clé pour résoudre de puzzle
-est de reconnaitre qu'il peut être résolu en cassant le problème en un
-ensemble de problèmes de plus petites tailles et de continuer cette
-réduction de la taille du problème jusqu'à atteindre une solution. La
-procédure suivante démontre cette approche :
+Write the core of the method: <code>[!java]void [/!]solve([!java]int
+[/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!],[!java]int
+[/!]autre[!scala]:Int[/!], [!java]int [/!]hauteur[!scala]:Int[/!])</code>
+
+<p>Cette méthode résout récursivement le problème.
+Le premier paramètre (nommé <code>src</code>) est l'index de la pile
+initiale.
+Le second paramètre (nommé <code>dst</code>) est l'index du piquet vers
+lequel la pile dont être déplacée.
+Le troisième paramètre (nommé <code>other</code>) est l'index du piquet
+inutilisé, tandis que le quatrième paramètre (nommé <code>hauteur</code>)
+est la taille de la pile à déplacer.</p>
+
+<p>La clé pour résoudre de puzzle est de reconnaitre qu'il peut être résolu en
+cassant le problème en un ensemble de problèmes de plus petites tailles et
+de continuer cette réduction de la taille du problème jusqu'à atteindre une
+solution.</p>
+
+<div class="tip" id="tip-1" alt="Je suis perdu, je voudrais plus d'indications">
+Voici le pseudo-code de la solution :
 <ul>
   <li>Etiquetons les tours A, B, C ( ces étiquettes peuvent changer à différentes
 étapes )</li>
@@ -45,3 +57,4 @@ poteau A</li>
   <li>déplacer le disque numéro n de A vers C</li>
   <li>deplacer n-1 disques de B vers C afin qu'ils reposent sur le disque numéro n</li>
 </ul>
+</div>
\ No newline at end of file
diff --git a/src/lessons/recursion/hanoi/HanoiBoard.html b/src/lessons/recursion/hanoi/HanoiBoard.html
index d40a448..1952391 100644
--- a/src/lessons/recursion/hanoi/HanoiBoard.html
+++ b/src/lessons/recursion/hanoi/HanoiBoard.html
@@ -1,18 +1,18 @@
 <h2>Tower of Hanoi</h2>
 
-The Tower of Hanoi or Towers of Hanoi , also called the Tower of Brahma or
-Towers of Brahma, is a mathematical game or puzzle. It consists of three rods,
-and a number of disks of different sizes which can slide onto any rod. The
+<p>The Tower of Hanoi or Towers of Hanoi, also called the Tower of Brahma or
+Towers of Brahma, is a mathematical game or puzzle. It consists of three pegs,
+and a number of disks of different sizes which can slide onto any peg. The
 puzzle starts with the disks in a neat stack in ascending order of size on one
-rod, the smallest at the top, thus forming a pyramid.
+peg, the smallest at the top, thus forming a pyramid.</p>
 
-The objective of the puzzle is to move the entire stack to another rod, obeying the following rules:
+The objective of the puzzle is to move the entire stack to another peg, obeying the following rules:
 <ul>
   <li>Only one disk may be moved at a time.</li>
 
-  <li>Each move consists of taking the upper disk from one of the rods and
-  sliding it onto another rod, on top of the other disks that may already be
-  present on that rod.</li>
+  <li>Each move consists of taking the upper disk from one of the pegs and
+  sliding it onto another peg, on top of the other disks that may already be
+  present on that peg.</li>
 
   <li>No disk may be placed on top of a smaller disk.</li>
 </ul>
@@ -20,18 +20,20 @@ The objective of the puzzle is to move the entire stack to another rod, obeying
 <h3>Goal of this exercise</h3> 
 
 Write the core of the method: 
-<code>[!java]void [/!]solve([!java]int [/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!], [!java]int [/!]height[!scala]:Int[/!])</code>
+<code>[!java]void [/!]solve([!java]int [/!]src[!scala]:Int[/!], [!java]int [/!]dst[!scala]:Int[/!],[!java]int [/!]other[!scala]:Int[/!], [!java]int [/!]height[!scala]:Int[/!])</code>
 
-This method will recursively solve the presented problem. First parameter
-named <code>src</code> is the index of the initial tower, second parameter
-<code>dst</code> is the index of the expected final tower, and the third
-parameter <code>height</code> is the height of the tower.
+<p>This method will recursively solve the presented problem. The first parameter
+named <code>src</code> is the index of the initial tower, the second parameter
+<code>dst</code> is the index of the expected final tower, the third parameter 
+<code>other</code> is the index of the unused peg while the fourth
+parameter <code>height</code> is the height of the tower.</p>
 
-A key to solving this puzzle is to recognize that it can be solved by breaking
+<p>A key to solving this puzzle is to recognize that it can be solved by breaking
 the problem down into a collection of smaller problems and further breaking
-those problems down into even smaller problems until a solution is reached.
+those problems down into even smaller problems until a solution is reached.</p>
 
-The following procedure demonstrates this approach:
+<div class="tip" id="tip-1" alt="I don't get it, please give me some extra indications">
+Here is the pseudo-code of the solution:
 <ul>
   <li>label the pegs A, B, C (these labels may move at different steps)</li>
   <li>let n be the total number of discs (the height of the initial tower)</li>
@@ -44,3 +46,4 @@ To move n discs from peg A to peg C:
   <li>move disc number n from A to C</li>
   <li>move n−1 discs from B to C so they sit on disc number n</li>
 </ul>
+</div>
\ No newline at end of file
diff --git a/src/lessons/recursion/hanoi/HanoiBoard.java b/src/lessons/recursion/hanoi/HanoiBoard.java
index 0cde935..a2ab19b 100644
--- a/src/lessons/recursion/hanoi/HanoiBoard.java
+++ b/src/lessons/recursion/hanoi/HanoiBoard.java
@@ -14,13 +14,13 @@ public class HanoiBoard extends ExerciseTemplated {
 		HanoiWorld[] myWorlds = new HanoiWorld[3];
 		myWorlds[0] = new HanoiWorld("solve(0,1)",  
 				new Integer[] {8,7,6,5,4,3,2,1}, new Integer[0],new Integer[0]);
-		myWorlds[0].setParameter(new Object[] {0,1});		
+		myWorlds[0].setParameter(new Object[] {0,1,2});		
 		myWorlds[1] = new HanoiWorld("solve(2,0)", 
 				new Integer[0] , new Integer[0],new Integer[] {8,7,6,5,4,3,2,1});
-		myWorlds[1].setParameter(new Object[] {2,0});		
+		myWorlds[1].setParameter(new Object[] {2,0,1});		
 		myWorlds[2] = new HanoiWorld("solve(1,2)", 
 				new Integer[0], new Integer[] {8,7,6,5,4,3,2,1}, new Integer[0]);
-		myWorlds[2].setParameter(new Object[] {1,2});		
+		myWorlds[2].setParameter(new Object[] {1,2,0});		
 		for (int i=0;i<myWorlds.length;i++) {
 			new HanoiEntity("worker",myWorlds[i]);
 		}
diff --git a/src/lessons/recursion/hanoi/HanoiBoardEntity.java b/src/lessons/recursion/hanoi/HanoiBoardEntity.java
index 3b711ea..3f48032 100644
--- a/src/lessons/recursion/hanoi/HanoiBoardEntity.java
+++ b/src/lessons/recursion/hanoi/HanoiBoardEntity.java
@@ -5,28 +5,20 @@ import lessons.recursion.hanoi.universe.HanoiEntity;
 public class HanoiBoardEntity extends HanoiEntity {
 
 	public void run() {
-		solve((Integer)getParam(0),(Integer) getParam(1));
+		solve((Integer)getParam(0),(Integer) getParam(1),(Integer) getParam(2));
 	}
 
 	/* BEGIN TEMPLATE */
-	public void solve(int src,int dst) {
-		solve(src,dst, getSlotSize(src));
+	public void solve(int src, int dst, int other) {
+		solve(src, dst, other, getSlotSize(src));
 	}
 
-	public void solve(int src, int dst, int height) {
+	public void solve(int src, int dst, int other, int height) {
 		/* BEGIN SOLUTION */
-		if (height!=0) {
-			int other=-1;
-			if (src+dst==1) /* 0+1 */
-				other=2;
-			if (src+dst==2) /* 0+2 */
-				other=1;
-			if (src+dst==3) /* 1+2 */
-				other=0;
-
-			solve(src,other, height-1);
+		if (height != 0) {
+			solve(src,other,dst, height-1);
 			move(src,dst);
-			solve(other,dst,height-1);
+			solve(other,dst,src, height-1);
 		}
 		/* END SOLUTION */
 	}
diff --git a/src/lessons/recursion/hanoi/HanoiBoardEntity.py b/src/lessons/recursion/hanoi/HanoiBoardEntity.py
index f8c2c87..9b95b90 100644
--- a/src/lessons/recursion/hanoi/HanoiBoardEntity.py
+++ b/src/lessons/recursion/hanoi/HanoiBoardEntity.py
@@ -1,21 +1,14 @@
 # BEGIN TEMPLATE
-def solve(src,dst,height=-1):
+def solve(src,dst,other, height=-1):
 	if height==-1: # initial case
 		height=getSlotSize(src) 
 	
 	# Your code here
 	# BEGIN SOLUTION
 	if height != 0:
-		if src+dst==1:   # 0+1
-			other=2
-		if src+dst==2:   # 0+2
-			other=1;
-		if src+dst==3:   # 1+2
-			other=0;
-
-		solve(src,other, height-1);
+		solve(src,other,dst, height-1);
 		move(src,dst);
-		solve(other,dst,height-1);
+		solve(other,dst,src, height-1);
 	# END SOLUTION
 # END TEMPLATE
-solve(getParam(0),getParam(1))
\ No newline at end of file
+solve(getParam(0),getParam(1),getParam(2))
\ No newline at end of file
diff --git a/src/lessons/recursion/hanoi/HanoiBoardEntity.scala b/src/lessons/recursion/hanoi/HanoiBoardEntity.scala
index d41e22f..d458b35 100644
--- a/src/lessons/recursion/hanoi/HanoiBoardEntity.scala
+++ b/src/lessons/recursion/hanoi/HanoiBoardEntity.scala
@@ -5,28 +5,20 @@ import lessons.recursion.hanoi.universe.HanoiEntity;
 class ScalaHanoiBoardEntity extends HanoiEntity {
 
 	override def run() {
-		solve(getParam(0).asInstanceOf[Int], getParam(1).asInstanceOf[Int]);
+		solve(getParam(0).asInstanceOf[Int], getParam(1).asInstanceOf[Int], getParam(2).asInstanceOf[Int]);
 	}
 
 	/* BEGIN TEMPLATE */
-	def solve(src:Int, dst:Int) {
-		solve(src,dst, getSlotSize(src));
+	def solve(src:Int, dst:Int, other:Int) {
+		solve(src,dst,other, getSlotSize(src));
 	}
 
-	def solve(src:Int, dst:Int, height:Int) {
+	def solve(src:Int, dst:Int, other:Int, height:Int) {
 		/* BEGIN SOLUTION */
 		if (height!=0) {
-			var other = -1;
-			if (src+dst==1) /* 0+1 */
-				other=2;
-			if (src+dst==2) /* 0+2 */
-				other=1;
-			if (src+dst==3) /* 1+2 */
-				other=0;
-
-			solve(src,other, height-1);
+			solve(src,other,dst, height-1);
 			move(src,dst);
-			solve(other,dst,height-1);
+			solve(other,dst,src, height-1);
 		}
 		/* END SOLUTION */
 	}
diff --git a/src/lessons/recursion/koch/Koch.fr.html b/src/lessons/recursion/koch/Koch.fr.html
index 9415271..0f039c5 100644
--- a/src/lessons/recursion/koch/Koch.fr.html
+++ b/src/lessons/recursion/koch/Koch.fr.html
@@ -4,18 +4,15 @@ Nous allons maintenant dessiner des flocons de neige en utilisant la
 fractale de Koch.  Une fractale est un dessin géométrique dont le motif se
 reproduit à n'importe quelle échelle.
 
-<p>La forme générale est un triangle dont chaque coté est donné par une série
-d'appels récursifs.  La forme générale est obtenue en enchainant trois cotés
-de la façon suivante.
-<pre>[!java]void [/!]snowFlake ([!java]int [/!]niveaux[!scala]:Int[/!], [!java]double [/!]longueur[!scala]:Double[/!])[!python]:[/!][!java|scala] {[/!]
-   snowSide(niveaux, longueur);
-   right(120);
-   snowSide(niveaux, longueur);
-   right(120);
-   snowSide(niveaux, longueur);
-   right(120);
-[!java|scala]}[/!]</pre>
+<p>La forme générale est une sorte de triangle, dont chaque coté est généré par
+des appels récursifs.
+Vous ne devez dessiner qu'un coté de ce triangle dans la fonction
+<code>snowSide</code>.
+Pour simplifier les choses, chaque coté a une couleur
+particulière. Contentez vous de dessiner les choses en rouge (sans changer
+votre couleur), et les autres couleurs seront dessinées automatiquement. </p>
 
 <p>Observez le dessin dans chaque monde objectif pour comprendre la logique de
 ce motif afin de la reproduire.  Vous devez écrire la fonction snowSide, qui
-est récursive.
+est récursive. Mais <b>n'appelez pas snowFlake depuis snowSide</b>, car
+sinon le résultat sera vraiment étrange et inattendu.</p>
diff --git a/src/lessons/recursion/koch/Koch.html b/src/lessons/recursion/koch/Koch.html
index 8b2cf7c..11ec7d4 100644
--- a/src/lessons/recursion/koch/Koch.html
+++ b/src/lessons/recursion/koch/Koch.html
@@ -1,19 +1,15 @@
 <h2>Snow flake</h2>
 
 We will now draw snow flakes using the Koch fractal. A fractal is a
-geometrical pattern repeated at every scale.
+geometric pattern repeated at every scale.
 
-<p>The general form is a triangle, with each side given by a serie of recursive
-calls. The general form is given by something like this:
-<pre>[!java]void [/!]snowFlake ([!java]int [/!]levels[!scala]:Int[/!], [!java]double [/!]length[!scala]:Double[/!])[!python]:[/!][!java|scala] {[/!]
-   snowSide(levels, length);
-   right(120);
-   snowSide(levels, length);
-   right(120);
-   snowSide(levels, length);
-   right(120);
-[!java|scala]}[/!]</pre>
+<p>The general form is a triangle, with each side given by several recursive
+calls. Your work is only to write the code of the <code>snowSide</code> method so 
+that it draws one side of the triangle. To make it easier, each sides are represented 
+in a specific color. Just draw the red things (without changing your pen color), 
+and the other colors will be drawn automatically. </p>
 
 <p>Observe the drawing in each world's objective to understand the pattern's
 logic, and then reproduce it. You must write the <code>snowSide()</code>
-method, which is recursive.
+method, which is recursive but <b>do not call snowFlake from snowSide</b>, 
+or you will get very strange unexpected behaviors.</p>
diff --git a/src/lessons/recursion/koch/KochEntity.java b/src/lessons/recursion/koch/KochEntity.java
index f354ed0..33bfe21 100644
--- a/src/lessons/recursion/koch/KochEntity.java
+++ b/src/lessons/recursion/koch/KochEntity.java
@@ -1,5 +1,7 @@
 package lessons.recursion.koch;
 
+import java.awt.Color;
+
 import plm.universe.turtles.Turtle;
 
 public class KochEntity extends Turtle {
@@ -8,8 +10,10 @@ public class KochEntity extends Turtle {
 	void snowFlake (int levels, double length) {
 		snowSide(levels, length);
 		right(120);
+		setColor(Color.blue);
 		snowSide(levels, length);
 		right(120);
+		setColor(Color.orange);
 		snowSide(levels, length);
 		right(120);
 	}
diff --git a/src/lessons/recursion/koch/KochEntity.py b/src/lessons/recursion/koch/KochEntity.py
index 844b8bd..6cb8437 100644
--- a/src/lessons/recursion/koch/KochEntity.py
+++ b/src/lessons/recursion/koch/KochEntity.py
@@ -17,8 +17,10 @@ def snowSide(levels, length):
 def snowFlake (levels, length):
 	snowSide(levels, length)
 	right(120)
+	setColor(Color.blue)
 	snowSide(levels, length)
 	right(120)
+	setColor(Color.orange)
 	snowSide(levels, length)
 	right(120)
 # END TEMPLATE
diff --git a/src/lessons/recursion/koch/KochEntity.scala b/src/lessons/recursion/koch/KochEntity.scala
index 2ffb3f3..4de65df 100644
--- a/src/lessons/recursion/koch/KochEntity.scala
+++ b/src/lessons/recursion/koch/KochEntity.scala
@@ -1,6 +1,7 @@
 package lessons.recursion.koch;
 
 import plm.universe.turtles.Turtle;
+import java.awt.Color
 
 class ScalaKochEntity extends Turtle {
 
@@ -8,8 +9,10 @@ class ScalaKochEntity extends Turtle {
 	def snowFlake (levels:Int, length:Double) {
 		snowSide(levels, length);
 		right(120);
+		setColor(Color.blue);
 		snowSide(levels, length);
 		right(120);
+		setColor(Color.orange);
 		snowSide(levels, length);
 		right(120);
 	}
diff --git a/src/lessons/recursion/sierpinski/Sierpinski.fr.html b/src/lessons/recursion/sierpinski/Sierpinski.fr.html
index dfac920..17dcb45 100644
--- a/src/lessons/recursion/sierpinski/Sierpinski.fr.html
+++ b/src/lessons/recursion/sierpinski/Sierpinski.fr.html
@@ -5,5 +5,8 @@ dans lequel sont imbriqués des triangles plus petits.  Le prototype de la
 fonction le traçant est le suivant :</p>
 <pre>[!java]void [/!]sierpinski([!java]int [/!]niveau[!scala]:Int[/!], [!java]double [/!]longueur[!scala]:Double[/!])</pre>
 
-<p>Consultez les objectifs de chaque monde pour comprendre comment écrire la
-fonction.</p> 
+<p>Consultez les objectifs des différents mondes pour comprendre le code que
+vous devez écrire. Pour dessiner un coté du triangle, vous devez dessiner un
+triangle récursif plus petit (avec la moitié de la taille) et avancer de la
+longueur demandée. Au total, vous devez dessiner 3 cotés de la sorte en
+tournant de 120 entre chaque.</p> 
diff --git a/src/lessons/recursion/sierpinski/Sierpinski.html b/src/lessons/recursion/sierpinski/Sierpinski.html
index 4ef21b3..96aed55 100644
--- a/src/lessons/recursion/sierpinski/Sierpinski.html
+++ b/src/lessons/recursion/sierpinski/Sierpinski.html
@@ -1,9 +1,10 @@
 <h2>Sierpinski's Triangle</h2>
 
 <p>The fractal we will now draw is formed of a big triangle inside which
-several smaller triangles are embeeded. The prototype of the fuction to draw
+several smaller triangles are embedded. The prototype of the function to draw
 it is the following:</p>
 <pre>[!java]void [/!]sierpinski([!java]int [/!]level[!scala]:Int[/!], [!java]double [/!]length[!scala]:Double[/!])</pre>
 
-<p>Have a look at each world's objective view to understand how to write the
-function.</p> 
+<p>Have a look at each world's objective view to understand how to write the function. 
+To draw one side of the triangle, draw a smaller recursive triangle (halve the length) and move forward by the requested length. 
+Globally, you have to draw 3 such sides and turn by 120 between each side.</p> 
diff --git a/src/lessons/recursion/sierpinski/SierpinskiEntity.java b/src/lessons/recursion/sierpinski/SierpinskiEntity.java
index 0d53127..3ca8aec 100644
--- a/src/lessons/recursion/sierpinski/SierpinskiEntity.java
+++ b/src/lessons/recursion/sierpinski/SierpinskiEntity.java
@@ -1,18 +1,15 @@
 package lessons.recursion.sierpinski;
 
-public class SierpinskiEntity extends plm.universe.turtles.Turtle {
 
+public class SierpinskiEntity extends plm.universe.turtles.Turtle {
 	/* BEGIN TEMPLATE */
 	public void sierpinski(int level, double length) {
 		/* BEGIN SOLUTION */
 		if (level >= 0) {
 			for (int i = 0; i < 3; i++) {
-				forward(length / 2.);
-				right(360. / 3.);
-				sierpinski(level-1, length / 2.);
-				left(360. / 3.);
-				forward(length / 2.);
-				right(360. / 3.);
+	             sierpinski(level-1,length/2);
+	             forward(length);
+	             right(120);
 			}
 		}
 		/* END SOLUTION */
diff --git a/src/lessons/recursion/sierpinski/SierpinskiEntity.py b/src/lessons/recursion/sierpinski/SierpinskiEntity.py
index 1ad9d5f..00a4ea9 100644
--- a/src/lessons/recursion/sierpinski/SierpinskiEntity.py
+++ b/src/lessons/recursion/sierpinski/SierpinskiEntity.py
@@ -3,12 +3,9 @@ def sierpinski(level, length):
     # BEGIN SOLUTION
     if (level >= 0):
       for i in range(3):
-        forward(length / 2.)
-        right(360. / 3.)
-        sierpinski(level-1, length / 2.)
-        left(360. / 3.)
-        forward(length / 2.)
-        right(360. / 3.)
+         sierpinski(level-1,length/2);
+         forward(length);
+         right(120);
     # END SOLUTION
 # END TEMPLATE
 sierpinski(getParam(0), getParam(1))
diff --git a/src/lessons/recursion/sierpinski/SierpinskiEntity.scala b/src/lessons/recursion/sierpinski/SierpinskiEntity.scala
index f67c442..291cb01 100644
--- a/src/lessons/recursion/sierpinski/SierpinskiEntity.scala
+++ b/src/lessons/recursion/sierpinski/SierpinskiEntity.scala
@@ -1,18 +1,14 @@
 package lessons.recursion.sierpinski;
 
 class ScalaSierpinskiEntity extends plm.universe.turtles.Turtle {
-
 	/* BEGIN TEMPLATE */
 	def sierpinski(level:Int, length:Double) {
 		/* BEGIN SOLUTION */
 		if (level >= 0) {
 			for (i <- 1 to 3) {
-				forward(length / 2.);
-				right(360. / 3.);
-				sierpinski(level-1, length / 2.);
-				left(360. / 3.);
-				forward(length / 2.);
-				right(360. / 3.);
+	             sierpinski(level-1,length/2);
+	             forward(length);
+	             right(120);
 			}
 		}
 		/* END SOLUTION */
diff --git a/src/lessons/recursion/spiral/SpiralUse.fr.html b/src/lessons/recursion/spiral/SpiralUse.fr.html
index 03538ab..490ee94 100644
--- a/src/lessons/recursion/spiral/SpiralUse.fr.html
+++ b/src/lessons/recursion/spiral/SpiralUse.fr.html
@@ -1,34 +1,27 @@
 <h2>Faire des spirales</h2>
 
-Saurez-vous faire les différents motifs de cet exercice en utilisant la
-méthode <code>spiral()</code>?
+<p>Cet exercice est un peu particulier, car vous n'avez rien à faire pour le
+passer. Tout le code nécessaire pour le passer est fourni, et il suffit de
+cliquer sur le bouton «Exécuter». Il est là pour vous permettre d'explorer
+les possibilités du code que vous venez d'écrire en changeant les paramètres
+de l'appel à la fonction <code>spiral</code>. Vous pouvez passer à
+l'exercice suivant si le temps vous manque, puis revenir jouer ici plus
+tard.</p>
 
-<p>Vous devez écrire une méthode <code>doit(page)</code> qui prend en paramètre
-le numéro de la page à dessiner. Son code est de la forme suivante. A0, B0,
-etc sont des nombres entiers. L'objectif de l'exercice est de retrouver les
-valeurs convenables pour chaque page.</p>
+<p>Voici quelques figures que l'on peut produire avec votre fonction
+<code>spiral</code> en lui passant les bons paramètres. Passez en mode
+créatif (dans le menu session) pour désactiver la correction de votre code
+quand vous explorez ces spirales.</p>
 
-<pre>
-[!java]void [/!]doit([!java]int [/!]page[!scala]:Int[/!])[!python]:[/!][!java|scala] {[/!]
-  [!java]switch (page) {[/!][!scala]page match {[/!][!python]  # Choix en fonction de la valeur de page[/!]
-    [!java]case 0:[/!][!scala]case 0 =>[/!][!python]if page==0:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Dessin sur la première page, nommée "One"</span>
-      spiral(A0,B0,C0,D0);
-[!java]      break;[/!]
-    [!java]case 1:[/!][!scala]case 1 =>[/!][!python]if page==1:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Dessin sur la seconde page, nommée "Two"</span>
-      spiral(A1,B1,C1,D1);
-[!java]      break;[/!]
-    [!java]case 2:[/!][!scala]case 2 =>[/!][!python]if page==2:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Dessin sur la troisième page, nommée "Three"</span> 
-      spiral(A2,B2,C2,D2);
-[!java]      break;[/!]
-    [!java]case 3:[/!][!scala]case 3 =>[/!][!python]if page==3:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Dessin sur la quatrième page, nommée "Four"</span> 
-      spiral(A3,B3,C3,D3);
-[!java]      break;[/!]
-    [!java]case 4:[/!][!scala]case 4 =>[/!][!python]if page==4:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Dessin sur la cinquième page, nommée "Five"</span>
-      spiral(A4,B4,C4,D4);[!java|scala]
-[!java]      break;[/!]
-  }
-}[/!]</pre>
+<img src="example-1.png"/> 
+<!-- spiral(100,120+1,1,2) -->
+<img src="example-2.png"/> 
+<!-- spiral(5,360/5,100,0) -->
+<img src="example-3.png"/> 
+<!-- spiral(5,2*360/5,150,0) -->
+<img src="example-4.png"/> 
 
-
-<p>Pas besoin de recopier le code de <code>spiral()</code>, la tortue de cet
-exercice connait déjà la méthode.</p>
+<!-- spiral(360,1,1,0) -->
+<p>Si vous découvrez une figure sympa n'oubliez pas de nous envoyer vos
+paramètres (menu Aide/envoyer une anomalie) pour que nous puissions
+l'ajouter à la liste!</p> 
\ No newline at end of file
diff --git a/src/lessons/recursion/spiral/SpiralUse.html b/src/lessons/recursion/spiral/SpiralUse.html
index c57caf1..004e609 100644
--- a/src/lessons/recursion/spiral/SpiralUse.html
+++ b/src/lessons/recursion/spiral/SpiralUse.html
@@ -1,34 +1,19 @@
 <h2>Drawing spirals</h2>
 
-Can you reproduce the provided patterns of this exercise using the
-<code>spiral()</code> method?
+<p>This exercise is not really an exercise in that sense that you just have to click on the 
+Execute button to get the reward: All the needed code is already provided. Instead, you can 
+here explore the possibilities of the code you just wrote by changing the parameters of the call 
+to the <code>spiral</code> function. You can move on to the next exercise if you are short on time, 
+and come back later to play around.</p>
 
-<p>You must provide a method called <code>doit(page)</code> taking the page number 
-to draw as parameter. Its code is as following, with A0, B0, etc being integers. 
-The goal of this exercise is to find the good values for each page, which requires to
-correctly understand how the spiral method works.</p>
+<p>Here are some of the figures that you can produce with your <code>Spiral</code> function, provided 
+that you come with the right parameters. You can switch to the creative mode (from the Session menu) 
+to disable the world comparison when you explore with these spirals.</p>
 
-<pre>
-[!java]void [/!]doit([!java]int [/!]page[!scala]:Int[/!])[!python]:[/!][!java|scala] {[/!]
-  [!java]switch (page) {[/!][!scala]page match {[/!][!python]  # select on the value of page[/!]
-    [!java]case 0:[/!][!scala]case 0 =>[/!][!python]if page==0:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Drawing of the first page, dubbed "One"</span>
-      spiral(A0,B0,C0,D0);
-[!java]      break;[/!]
-    [!java]case 1:[/!][!scala]case 1 =>[/!][!python]if page==1:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Drawing of the second page, dubbed "Two"</span>
-      spiral(A1,B1,C1,D1);
-[!java]      break;[/!]
-    [!java]case 2:[/!][!scala]case 2 =>[/!][!python]if page==2:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Drawing of the page dubbed "Three"</span> 
-      spiral(A2,B2,C2,D2);
-[!java]      break;[/!]
-    [!java]case 3:[/!][!scala]case 3 =>[/!][!python]if page==3:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Drawing of the page dubbed "Four"</span> 
-      spiral(A3,B3,C3,D3);
-[!java]      break;[/!]
-    [!java]case 4:[/!][!scala]case 4 =>[/!][!python]if page==4:[/!] <span class="Comment">[!java|scala]//[/!][!python]#[/!] Drawing of the page dubbed "Five"</span>
-      spiral(A4,B4,C4,D4);[!java|scala]
-[!java]      break;[/!]
-  }
-}[/!]</pre>
+<img src="example-1.png"/> <!-- spiral(100,120+1,1,2) -->
+<img src="example-2.png"/> <!-- spiral(5,360/5,100,0) -->
+<img src="example-3.png"/> <!-- spiral(5,2*360/5,150,0) -->
+<img src="example-4.png"/> <!-- spiral(360,1,1,0) -->
 
-
-<p>No need to copy over the method of <code>spiral()</code>, the turtle of this
-exercise already knows it.</p>
+<p>If you discover a cool figure, don't forget to send your parameters (menu Help/feedback) so 
+that we can add it to the list!</p> 
\ No newline at end of file
diff --git a/src/lessons/recursion/spiral/SpiralUse.java b/src/lessons/recursion/spiral/SpiralUse.java
index 8d7d4a9..f9f1aae 100644
--- a/src/lessons/recursion/spiral/SpiralUse.java
+++ b/src/lessons/recursion/spiral/SpiralUse.java
@@ -2,7 +2,6 @@ package lessons.recursion.spiral;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
-import plm.universe.World;
 import plm.universe.turtles.Turtle;
 import plm.universe.turtles.TurtleWorld;
 
@@ -12,28 +11,9 @@ public class SpiralUse extends ExerciseTemplated {
 		super(lesson);
 
 		/* Create initial situation */
-		World[] myWorlds = new World[5];
-		
-		myWorlds[0] = new TurtleWorld("One", 400, 400);
-		myWorlds[0].setParameter(new Integer[] {0});		
-		new Turtle(myWorlds[0], "Hawksbill", 200, 200);
+		TurtleWorld myWorld = new TurtleWorld("Sheet", 400, 400);
+		new Turtle(myWorld, "Hawksbill", 200, 200);
 
-		myWorlds[1] = new TurtleWorld("Two", 400, 400);
-		myWorlds[1].setParameter(new Integer[] {1});		
-		new Turtle(myWorlds[1], "Hawksbill", 200, 200);
-
-		myWorlds[2] = new TurtleWorld("Three", 400, 400);
-		myWorlds[2].setParameter(new Integer[] {2});		
-		new Turtle(myWorlds[2], "Hawksbill", 200, 200);
-
-		myWorlds[3] = new TurtleWorld("Four", 400, 400);
-		myWorlds[3].setParameter(new Integer[] {3});		
-		new Turtle(myWorlds[3], "Hawksbill", 200, 200);
-
-		myWorlds[4] = new TurtleWorld("Five", 400, 400);
-		myWorlds[4].setParameter(new Integer[] {4});		
-		new Turtle(myWorlds[4], "Hawksbill", 200, 200);
-		
-		setup(myWorlds);
+		setup(myWorld);
 	}
 }
diff --git a/src/lessons/recursion/spiral/SpiralUseEntity.java b/src/lessons/recursion/spiral/SpiralUseEntity.java
index 9bf5fc0..c11b8a6 100644
--- a/src/lessons/recursion/spiral/SpiralUseEntity.java
+++ b/src/lessons/recursion/spiral/SpiralUseEntity.java
@@ -15,20 +15,8 @@ public class SpiralUseEntity extends Turtle {
 	}
 
 	/* BEGIN TEMPLATE */
-	void doit(int page) {
-		/* BEGIN SOLUTION */
-		switch (page) {
-		case 0:	spiral(100,90+1,1,2);  break;
-		case 1:	spiral(100,120+1,1,2); break;
-		case 2: spiral(5,360/5,100,0);  break;
-		case 3: spiral(5,2*360/5,150,0); break;
-		case 4: spiral(360,1,1,0);   break;	
-		}
-		/* END SOLUTION */
-	}
-	/* END TEMPLATE */
-
 	public void run() {
-		doit((Integer)getParam(0));
+		spiral(100,91,1,2);
 	}
+	/* END TEMPLATE */
 }
diff --git a/src/lessons/recursion/spiral/SpiralUseEntity.py b/src/lessons/recursion/spiral/SpiralUseEntity.py
index c9f60c8..eaa6042 100644
--- a/src/lessons/recursion/spiral/SpiralUseEntity.py
+++ b/src/lessons/recursion/spiral/SpiralUseEntity.py
@@ -7,19 +7,5 @@ def spiral(steps, angle, length, increment):
     spiral(steps-1, angle, length+increment, increment)
   
 # BEGIN TEMPLATE
-def doit(page):
-  # BEGIN SOLUTION
-  if page == 0:
-    spiral(100,90+1,1,2)
-  elif page == 1:
-    spiral(100,120+1,1,2)
-  elif page == 2:
-    spiral(5,360/5,100,0)
-  elif page == 3:
-    spiral(5,2*360/5,150,0)
-  elif page == 4:
-    spiral(360,1,1,0)  
-  # END SOLUTION
+spiral(100,91,1,2)
 # END TEMPLATE
-  
-doit(getParam(0))
diff --git a/src/lessons/recursion/spiral/SpiralUseEntity.scala b/src/lessons/recursion/spiral/SpiralUseEntity.scala
index 9f9d5a3..cab4872 100644
--- a/src/lessons/recursion/spiral/SpiralUseEntity.scala
+++ b/src/lessons/recursion/spiral/SpiralUseEntity.scala
@@ -15,21 +15,8 @@ class ScalaSpiralUseEntity extends Turtle {
 	}
 
 	/* BEGIN TEMPLATE */
-	def doit(page:Int) {
-		/* BEGIN SOLUTION */
-		page match {
-		case 0 =>	spiral(100,90+1,1,2);
-		case 1 =>	spiral(100,120+1,1,2);
-		case 2 => spiral(5,360/5,100,0); 
-		case 3 => spiral(5,2*360/5,150,0);
-		case 4 => spiral(360,1,1,0);   	
-		case _ => 
-		}
-		/* END SOLUTION */
-	}
-	/* END TEMPLATE */
-
 	override def run() {
-		doit(getParam(0).asInstanceOf[Int]);
+		spiral(100,91,1,2);
 	}
+	/* END TEMPLATE */
 }
diff --git a/src/lessons/recursion/spiral/example-1.png b/src/lessons/recursion/spiral/example-1.png
new file mode 100644
index 0000000..a5e49ac
Binary files /dev/null and b/src/lessons/recursion/spiral/example-1.png differ
diff --git a/src/lessons/recursion/spiral/example-2.png b/src/lessons/recursion/spiral/example-2.png
new file mode 100644
index 0000000..cd1ac79
Binary files /dev/null and b/src/lessons/recursion/spiral/example-2.png differ
diff --git a/src/lessons/recursion/spiral/example-3.png b/src/lessons/recursion/spiral/example-3.png
new file mode 100644
index 0000000..2f80c7a
Binary files /dev/null and b/src/lessons/recursion/spiral/example-3.png differ
diff --git a/src/lessons/recursion/spiral/example-4.png b/src/lessons/recursion/spiral/example-4.png
new file mode 100644
index 0000000..8fb9be3
Binary files /dev/null and b/src/lessons/recursion/spiral/example-4.png differ
diff --git a/src/lessons/recursion/star/Star.fr.html b/src/lessons/recursion/star/Star.fr.html
deleted file mode 100644
index 3144b7c..0000000
--- a/src/lessons/recursion/star/Star.fr.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<h2>Tortues dans les étoiles</h2>
-
-Voici un dernier exercice de prise en main avant la récursion. Il s'agit de
-faire dessiner trois étoiles à 5 branches à la tortue. Comme toutes les
-étoiles régulières à N branches, les angles des pointes sont de 360/N degrés
-tandis que les angles entre les pointes sont de 2*360/N degrés.
-
-<p>La première étoile à dessiner est noire (<code>Color.black</code>) et ses
-branches font 100 pas de longueur, la seconde est bleue
-(<code>Color.blue</code>) et ses branches font 80 pas de longueur. Elle est
-décallée de 45 degrés vers le bas par rapport à la première.  La dernière
-étoile est rouge (<code>Color.red</code>), ses branches font 60 pas, et elle
-est décallée de 45 degrés par rapport à la seconde.</p>
-
-<p>Consultez l'objectif du monde pour visualiser la figure à réaliser.</p>
diff --git a/src/lessons/recursion/star/Star.html b/src/lessons/recursion/star/Star.html
deleted file mode 100644
index f58fb50..0000000
--- a/src/lessons/recursion/star/Star.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<h2>Turtles in the stars</h2>
-
-This is the last hand-on turtles exercise before recursion. The goal is to
-draw three 5-branches stars. Like any regular stars with N branches, the
-angle at each external corners are 360/N degrees while the angles between
-branches are of 2*360/N degrees.
-
-<p>The first star to draw is black (<code>Color.black</code>) and its branches
-are 100 steps long. The second is blue (<code>Color.blue</code>) and its
-branches are 80 steps long. It's shifted of 45 degrees from the first
-one. The last star is red (<code>Color.red</code>), its branches are 60
-steps long and it's shifted of 45 degrees from the previous one.</p>
-
-<p>Observe the world's objective to visualize the picture to draw.</p>
diff --git a/src/lessons/recursion/star/Star.java b/src/lessons/recursion/star/Star.java
deleted file mode 100644
index 3962b54..0000000
--- a/src/lessons/recursion/star/Star.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package lessons.recursion.star;
-
-import plm.core.model.lesson.ExerciseTemplated;
-import plm.core.model.lesson.Lesson;
-import plm.universe.World;
-import plm.universe.turtles.Turtle;
-import plm.universe.turtles.TurtleWorld;
-
-public class Star extends ExerciseTemplated {
-
-	public Star(Lesson lesson) {
-		super(lesson);
-
-		/* Create initial situation */
-		World myWorld = new TurtleWorld("WhiteBoard", 400, 400);
-
-		new Turtle(myWorld, "Hawksbill", 100, 200);
-		setup(myWorld);
-	}
-}
diff --git a/src/lessons/recursion/star/StarEntity.java b/src/lessons/recursion/star/StarEntity.java
deleted file mode 100644
index 38e8a68..0000000
--- a/src/lessons/recursion/star/StarEntity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package lessons.recursion.star;
-
-import java.awt.Color;
-
-import plm.universe.turtles.Turtle;
-
-public class StarEntity extends Turtle {
-
-	/* BEGIN TEMPLATE */
-	public void run() {
-		/* BEGIN SOLUTION */
-		star(100, Color.black);
-		right(45);
-		star(80, Color.blue);
-		right(45);
-		star(60, Color.red);
-	}
-	public void branch(int size) {
-		forward(size);
-		right(360 / BRANCH_COUNT);
-		forward(size);
-
-		for (int i = 0; i < 2; i++)
-			left(360 / BRANCH_COUNT);
-	}
-
-	public static final int BRANCH_COUNT = 5;
-	public void star(int size, Color c) {
-		setColor(c);
-		for (int i = 0; i < BRANCH_COUNT; i++) {
-			branch(size);
-		}
-		/* END SOLUTION */
-	}
-	/* END TEMPLATE */
-}
diff --git a/src/lessons/recursion/star/StarEntity.py b/src/lessons/recursion/star/StarEntity.py
deleted file mode 100644
index ffe84a5..0000000
--- a/src/lessons/recursion/star/StarEntity.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# BEGIN SOLUTION 
-
-BRANCH_COUNT = 5
-
-def branch(size):
-	forward(size);
-	right(360 / BRANCH_COUNT)
-	forward(size)
-
-	for i in range(2):
-		left(360 / BRANCH_COUNT)
-
-
-def star(size, c):
-	setColor(c)
-	for i in range(BRANCH_COUNT):
-		branch(size)
-
-star(100, Color.black)
-right(45)
-star(80, Color.blue)
-right(45)
-star(60, Color.red)
-# END SOLUTION
diff --git a/src/lessons/recursion/star/StarEntity.scala b/src/lessons/recursion/star/StarEntity.scala
deleted file mode 100644
index e6def3b..0000000
--- a/src/lessons/recursion/star/StarEntity.scala
+++ /dev/null
@@ -1,36 +0,0 @@
-package lessons.recursion.star;
-
-import java.awt.Color;
-
-import plm.universe.turtles.Turtle;
-
-class ScalaStarEntity extends Turtle {
-
-	/* BEGIN TEMPLATE */
-	override def run() {
-		/* BEGIN SOLUTION */
-		star(100, Color.black);
-		right(45);
-		star(80, Color.blue);
-		right(45);
-		star(60, Color.red);
-	}
-	def branch(size:Int) {
-		forward(size);
-		right(360 / BRANCH_COUNT);
-		forward(size);
-
-		for (i <- 1 to 2)
-			left(360 / BRANCH_COUNT);
-	}
-
-	val BRANCH_COUNT = 5;
-	def star(size:Int, c:Color) {
-		setColor(c);
-		for (i <- 1 to BRANCH_COUNT) {
-			branch(size);
-		}
-		/* END SOLUTION */
-	}
-	/* END TEMPLATE */
-}
diff --git a/src/lessons/recursion/tree/Tree.fr.html b/src/lessons/recursion/tree/Tree.fr.html
index 9371fff..ca03ded 100644
--- a/src/lessons/recursion/tree/Tree.fr.html
+++ b/src/lessons/recursion/tree/Tree.fr.html
@@ -1,15 +1,31 @@
 <h2>Arbres</h2>
 
-Nous allons maintenant dessiner des arbres. Pour cela, nous allons écrire
-une fonction doublement récursive de prototype 
+<p>Nous allons maintenant dessiner des arbres. Pour cela, nous allons écrire
+une fonction doublement récursive de prototype</p> 
 <pre>[!java]void [/!]tree([!java]int [/!]nbPas[!scala]:Int[/!], [!java]double [/!]longueur[!scala]:Double[/!], [!java]double [/!]angle[!scala]:Double[/!], [!java]double [/!]multiplicateur[!scala]:Double[/!])</pre>
 
 <p>Pour dessiner un arbre à quatre étages, il faut dessiner un tronc de la
 taille indiquée, tourner à droite de l'angle indiqué, faire un arbre à 3
 étages, tourner à gauche de deux fois l'angle indiqué, faire un autre arbre
-à 3 étages, puis revenir à sa position initiale. 
+à 3 étages, puis revenir à sa position initiale. N'oubliez pas de revenir à
+la position initiale !<p>
 
 <p>Si le tronc d'un arbre mesure length à l'étage N, il mesure shrink*length à
-l'étage N+1.
- 
+l'étage N+1.<p>
 
+<p>Comme vous pouvez le voir, chaque étage de la récursion est représenté par
+une couleur distinctive. Pour cela, appelez la fonction
+<code>current(step)</code> en lui passant en paramètre l'étage actuel de la
+récursion. Elle se chargera de choisir la couleur adéquate. N'effacez pas
+vos couleurs quand vous retournez à votre position initiale.</p>
+
+<p>Si vous vous trompez dans votre fonction, il peut facilement devenir très
+compliqué de debugger votre code. Vos erreurs se produisant à tous les
+étages de la récursion, le dessin peut vite devenir illisible. Pour vous
+aider à debugger, vous pouvez utiliser la fonction <code>subtree()</code>
+qui dessine un sous-arbre correct. Cette fonction est très (très) semblable
+par ailleurs à la fonction que vous tentez d'écrire. La seule différence est
+que <code>subtree()</code> ne dessine qu'en noir. Vous pouvez donc
+l'utiliser à la place de vos appels récursifs pendant le debug, mais vous
+devez changer pour des appels récursifs à votre propre code (quand il
+marche) pour avoir les couleurs justes, et donc pour passer l'exercice. </p>  
\ No newline at end of file
diff --git a/src/lessons/recursion/tree/Tree.html b/src/lessons/recursion/tree/Tree.html
index 6ea950d..cca7b93 100644
--- a/src/lessons/recursion/tree/Tree.html
+++ b/src/lessons/recursion/tree/Tree.html
@@ -1,15 +1,25 @@
 <h2>Trees</h2>
 
-We will now draw trees. For that, we will write a method using double
-recursion following this prototype 
+<p>We will now draw trees. For that, we will write a method using double
+recursion following this prototype</p> 
 <pre>[!java]void [/!]tree([!java]int [/!]steps[!scala]:Int[/!], [!java]double [/!]length[!scala]:Double[/!], [!java]double [/!]angle[!scala]:Double[/!], [!java]double [/!]shrink[!scala]:Double[/!])</pre>
 
 <p>To draw a tree of four levels, you have to draw a trunk of the given length,
 turn right of the given angle, draw a tree of level 3, turn left twice of
 the given angle, draw another tree of level 3, and come back to your initial
-location. 
+location. Don't forget to come back to the initial location!<p>
 
 <p>If a tree's trunk is of length 'len', the trunk of the next level tree will
-be of length 'len*shrink'.
- 
+be of length 'len*shrink'.<p>
 
+<p>As you can see, each recursion level is represented by a distinctive color. For that, you have to call the 
+<code>current(step)</code>, passing the current recursion level as a parameter. This will pick the right color for you.
+Don't erase your great colors when you move back to your initial location.</p>
+
+<p>If you get your function wrong, this can easily become hairly to debug as your 
+errors will appear at each level of the recursion, completely changing the drawing.
+For debugging purpose, you can use the <code>subtree()</code> that will draw a correct 
+subtree. This function is then very similar to the one you are trying to write. The only difference 
+is that <code>subtree()</code> only draws in black. So, you can use it instead of a recursive call 
+to debug your code, but you have to change for a proper recursive call to your own code (once it works) 
+to get the colors right, and pass the exercise.</p>  
\ No newline at end of file
diff --git a/src/lessons/recursion/tree/TreeEntity.java b/src/lessons/recursion/tree/TreeEntity.java
index 33042f1..ccabf0e 100644
--- a/src/lessons/recursion/tree/TreeEntity.java
+++ b/src/lessons/recursion/tree/TreeEntity.java
@@ -1,8 +1,37 @@
 package lessons.recursion.tree;
 
+import java.awt.Color;
+
+import plm.core.model.Game;
 import plm.universe.turtles.Turtle;
 
 public class TreeEntity extends Turtle {
+	@Override
+	public void setX(int i)  {
+		if (isInited())
+			throw new RuntimeException(Game.i18n.tr("Sorry Dave, I cannot let you use setX(x) in this exercise. Walk to your goal instead."));
+	}
+	@Override
+	public void setY(int i)  { 
+		if (isInited())
+			throw new RuntimeException(Game.i18n.tr("Sorry Dave, I cannot let you use setY(y) in this exercise. Walk to your goal instead."));
+	}
+	@Override
+	public void setPos(int i,int j)  { 
+		if (isInited())
+			throw new RuntimeException(Game.i18n.tr("Sorry Dave, I cannot let you use setPos(x,y) in this exercise. Walk to your goal instead."));
+	}
+
+	Color[] colors = new Color[] {Color.cyan,      Color.blue,   Color.magenta, 
+			Color.orange,    Color.yellow, Color.green,
+			Color.lightGray, Color.gray,   Color.darkGray,   Color.black, Color.red};
+
+	private void current(int v) {
+		if (v>=colors.length || v < 0)
+			setColor(colors[colors.length -1]);
+		setColor(colors[v]);
+	}
+
 
 	/* BEGIN TEMPLATE */
 	public void tree(int steps, double length, double angle, double shrink)	{
@@ -10,17 +39,32 @@ public class TreeEntity extends Turtle {
 		if (steps <= 0) {
 			/* do nothing */
 		} else {
+			current(steps);
 			forward(length);
 			right(angle);	         
 			tree(steps-1, length*shrink, angle, shrink);
 			left(2*angle);	         
 			tree(steps-1, length*shrink, angle, shrink);
 			right(angle);	         
+			current(steps);
 			backward(length);
 		}
 		/* END SOLUTION */	
 	}
 	/* END TEMPLATE */
+	public void subtree(int steps, double length, double angle, double shrink)	{
+		if (steps != 0) {
+			setColor(Color.black);
+			forward(length);
+			right(angle);	         
+			subtree(steps-1, length*shrink, angle, shrink);
+			left(2*angle);	         
+			subtree(steps-1, length*shrink, angle, shrink);
+			right(angle);	         
+			backward(length);
+		}
+		/* END SOLUTION */	
+	}
 
 	public void run() {
 		tree((Integer)getParam(0),(Double)getParam(1),(Double)getParam(2),(Double)getParam(3));
diff --git a/src/lessons/recursion/tree/TreeEntity.py b/src/lessons/recursion/tree/TreeEntity.py
index bcec3a0..7429709 100644
--- a/src/lessons/recursion/tree/TreeEntity.py
+++ b/src/lessons/recursion/tree/TreeEntity.py
@@ -1,15 +1,43 @@
+def setX(i):
+	errorMsg("Sorry Dave, I cannot let you use setX(x) in this exercise. Walk to your goal instead.")
+def setY(i):
+	errorMsg("Sorry Dave, I cannot let you use setY(y) in this exercise. Walk to your goal instead.")
+def setPos(x,y):
+	errorMsg("Sorry Dave, I cannot let you use setPos(x,y) in this exercise. Walk to your goal instead.")
+
+colors = [Color.cyan,      Color.blue,   Color.magenta, 
+          Color.orange,    Color.yellow, Color.green,
+          Color.lightGray, Color.gray,   Color.darkGray,   Color.black, Color.red]
+
+def current(i):
+    if (i>=len(colors) or i < 0):
+        setColor(Color.red)
+    else:
+        setColor(colors[i])
+
+def subtree(steps, length, angle, shrink):
+  if (steps != 0):
+    setColor(Color.black)
+    forward(length)
+    right(angle)
+    subtree(steps-1, length*shrink, angle, shrink)
+    left(2*angle)
+    subtree(steps-1, length*shrink, angle, shrink)
+    right(angle)
+    backward(length)
+
 # BEGIN TEMPLATE
 def tree(steps, length, angle, shrink):
   # BEGIN SOLUTION
-  if (steps <= 0):
-    pass# do nothing 
-  else:
+  if (steps != 0):
+    current(steps)
     forward(length)
     right(angle)
     tree(steps-1, length*shrink, angle, shrink)
     left(2*angle)
     tree(steps-1, length*shrink, angle, shrink)
     right(angle)
+    current(steps)
     backward(length)
   # END SOLUTION
 # END TEMPLATE
diff --git a/src/lessons/recursion/tree/TreeEntity.scala b/src/lessons/recursion/tree/TreeEntity.scala
index 5a37cc0..81d209a 100644
--- a/src/lessons/recursion/tree/TreeEntity.scala
+++ b/src/lessons/recursion/tree/TreeEntity.scala
@@ -1,26 +1,64 @@
 package lessons.recursion.tree;
 
-import plm.universe.turtles.Turtle;
+import plm.universe.turtles.Turtle
+import java.awt.Color
+import plm.core.model.Game
 
 class ScalaTreeEntity extends Turtle {
 
+	override def setX(i: Int)  {
+		if (isInited)
+			throw new RuntimeException(Game.i18n.tr("Sorry Dave, I cannot let you use setX(x) in this exercise. Walk to your goal instead."));
+	}
+	override def setY(i: Int)  { 
+		if (isInited)
+			throw new RuntimeException(Game.i18n.tr("Sorry Dave, I cannot let you use setY(y) in this exercise. Walk to your goal instead."));
+	}
+	override def setPos(x: Int, y:Int)  { 
+		if (isInited)
+			throw new RuntimeException(Game.i18n.tr("Sorry Dave, I cannot let you use setPos(x,y) in this exercise. Walk to your goal instead."));
+	}
+	
+	val colors:Array[Color] = Array(Color.cyan,      Color.blue,   Color.magenta, 
+									Color.orange,    Color.yellow, Color.green,
+									Color.lightGray, Color.gray,   Color.darkGray,   Color.black, Color.red)
+									
+	def current(v:Int) {
+	  if (v>=colors.length || v < 0)
+	    setColor(colors(colors.length -1));
+	  setColor(colors(v))
+	}
+  
 	/* BEGIN TEMPLATE */
 	def tree(steps:Int, length:Double, angle:Double, shrink:Double)	{
 		/* BEGIN SOLUTION */
-		if (steps <= 0) {
-			/* do nothing */
-		} else {
+		if (steps != 0) {
+		    current(steps)
 			forward(length);
 			right(angle);	         
 			tree(steps-1, length*shrink, angle, shrink);
 			left(2*angle);	         
 			tree(steps-1, length*shrink, angle, shrink);
 			right(angle);	         
+			current(steps);
 			backward(length);
 		}
 		/* END SOLUTION */	
 	}
 	/* END TEMPLATE */
+	def subtree(steps:Int, length:Double, angle:Double, shrink:Double)	{
+		if (steps != 0) {
+			setColor(Color.black)
+			forward(length);
+			right(angle);	         
+			subtree(steps-1, length*shrink, angle, shrink);
+			left(2*angle);	         
+			subtree(steps-1, length*shrink, angle, shrink);
+			right(angle);	         
+			backward(length);
+		}
+		/* END SOLUTION */	
+	}
 
 	override def run() {
 		tree(getParam(0).asInstanceOf[Int],getParam(1).asInstanceOf[Double],
diff --git a/src/lessons/sort/Main.fr.html b/src/lessons/sort/basic/Main.fr.html
similarity index 100%
rename from src/lessons/sort/Main.fr.html
rename to src/lessons/sort/basic/Main.fr.html
diff --git a/src/lessons/sort/Main.html b/src/lessons/sort/basic/Main.html
similarity index 100%
rename from src/lessons/sort/Main.html
rename to src/lessons/sort/basic/Main.html
diff --git a/src/lessons/sort/Main.java b/src/lessons/sort/basic/Main.java
similarity index 51%
rename from src/lessons/sort/Main.java
rename to src/lessons/sort/basic/Main.java
index d2e5739..c635bc1 100644
--- a/src/lessons/sort/Main.java
+++ b/src/lessons/sort/basic/Main.java
@@ -1,18 +1,18 @@
-package lessons.sort;
+package lessons.sort.basic;
 
+import lessons.sort.basic.bubble.AlgBubbleSort1;
+import lessons.sort.basic.bubble.AlgBubbleSort2;
+import lessons.sort.basic.bubble.AlgBubbleSort3;
+import lessons.sort.basic.cocktail.AlgCocktailSort1;
+import lessons.sort.basic.cocktail.AlgCocktailSort2;
+import lessons.sort.basic.cocktail.AlgCocktailSort3;
+import lessons.sort.basic.comb.AlgCombSort;
+import lessons.sort.basic.comb.AlgCombSort11;
+import lessons.sort.basic.gnome.AlgGnomeSort;
+import lessons.sort.basic.insertion.AlgInsertionSort;
+import lessons.sort.basic.selection.AlgSelectionSort;
+import lessons.sort.basic.shell.AlgShellSort;
 import plm.core.model.lesson.Lesson;
-import lessons.sort.bubble.AlgBubbleSort1;
-import lessons.sort.bubble.AlgBubbleSort2;
-import lessons.sort.bubble.AlgBubbleSort3;
-import lessons.sort.cocktail.AlgCocktailSort1;
-import lessons.sort.cocktail.AlgCocktailSort2;
-import lessons.sort.cocktail.AlgCocktailSort3;
-import lessons.sort.comb.AlgCombSort;
-import lessons.sort.comb.AlgCombSort11;
-import lessons.sort.gnome.AlgGnomeSort;
-import lessons.sort.insertion.AlgInsertionSort;
-import lessons.sort.selection.AlgSelectionSort;
-import lessons.sort.shell.AlgShellSort;
 
 // see http://www.cs.ubc.ca/~harrison/Java/sorting-demo.html
 
diff --git a/src/lessons/sort/bubble/AlgBubbleSort1.fr.html b/src/lessons/sort/basic/bubble/AlgBubbleSort1.fr.html
similarity index 95%
rename from src/lessons/sort/bubble/AlgBubbleSort1.fr.html
rename to src/lessons/sort/basic/bubble/AlgBubbleSort1.fr.html
index 36fd695..0c0d976 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort1.fr.html
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort1.fr.html
@@ -21,7 +21,7 @@ histoire.</p>
 première vue. Le temps s'écoule de gauche à droite, et les cases du tableau
 sont représentée de haut en bas. Les lignes de différentes couleurs qui
 serpentent représentent les différentes valeurs contenues dans le
-tableau. Quand deux lignes se croises, cela signifie que les valeurs du
+tableau. Quand deux lignes se croisent, cela signifie que les valeurs du
 tableau ont été échangées à ce moment de l'historique; un embranchement
 signifie que la valeur a été copiée; une valeur en violet suivie d'un point
 d'interrogation a été lue avec getValeur() et une valeur en rouge suivie
@@ -45,7 +45,7 @@ jamais utilisé en pratique.</p>
 <p>Le pseudo-code de l'algorithme du tri à bulles est donc le suivant :</p>
 <pre>faire: 
         Pour tout i dans [0,lgr-2]
-          Si les cases i et i+1 doivent être inverser, le faire
+          Si les cases i et i+1 doivent être inversées, le faire
      tant qu'on a inverser des choses lors du dernier parcours
 </pre>
 </div>
diff --git a/src/lessons/sort/bubble/AlgBubbleSort1.html b/src/lessons/sort/basic/bubble/AlgBubbleSort1.html
similarity index 100%
rename from src/lessons/sort/bubble/AlgBubbleSort1.html
rename to src/lessons/sort/basic/bubble/AlgBubbleSort1.html
diff --git a/src/lessons/sort/bubble/AlgBubbleSort1.java b/src/lessons/sort/basic/bubble/AlgBubbleSort1.java
similarity index 94%
rename from src/lessons/sort/bubble/AlgBubbleSort1.java
rename to src/lessons/sort/basic/bubble/AlgBubbleSort1.java
index 78bbb26..540c826 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort1.java
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort1.java
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/bubble/AlgBubbleSort1Entity.java b/src/lessons/sort/basic/bubble/AlgBubbleSort1Entity.java
similarity index 92%
rename from src/lessons/sort/bubble/AlgBubbleSort1Entity.java
rename to src/lessons/sort/basic/bubble/AlgBubbleSort1Entity.java
index 2ef3deb..6408a75 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort1Entity.java
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort1Entity.java
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/bubble/AlgBubbleSort1Entity.py b/src/lessons/sort/basic/bubble/AlgBubbleSort1Entity.py
similarity index 100%
rename from src/lessons/sort/bubble/AlgBubbleSort1Entity.py
rename to src/lessons/sort/basic/bubble/AlgBubbleSort1Entity.py
diff --git a/src/lessons/sort/bubble/AlgBubbleSort1Entity.scala b/src/lessons/sort/basic/bubble/AlgBubbleSort1Entity.scala
similarity index 92%
rename from src/lessons/sort/bubble/AlgBubbleSort1Entity.scala
rename to src/lessons/sort/basic/bubble/AlgBubbleSort1Entity.scala
index f1de43a..bd8f5ca 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort1Entity.scala
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort1Entity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/bubble/AlgBubbleSort2.fr.html b/src/lessons/sort/basic/bubble/AlgBubbleSort2.fr.html
similarity index 95%
rename from src/lessons/sort/bubble/AlgBubbleSort2.fr.html
rename to src/lessons/sort/basic/bubble/AlgBubbleSort2.fr.html
index ed6f31e..e5c57e4 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort2.fr.html
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort2.fr.html
@@ -3,7 +3,7 @@
 <p>En étudiant le comportement du tri à bulle, on peut voir une première
 optimisation facile à effectuer: Après un parcours, le dernier élément du
 tableau est forcément le plus grand d'entre tous car le parcours l'a fait
-remonté comme une bulle à sa position. Plus généralement, après N parcours,
+remonter comme une bulle à sa position. Plus généralement, après N parcours,
 on sait que les N derniers éléments du tableau sont déjà triés. En
 conclusion, il n'est pas utile de les recomparer sur les parcours
 suivants. Dans un premier temps, nous ferons autant de parcours qu'il y a
diff --git a/src/lessons/sort/bubble/AlgBubbleSort2.html b/src/lessons/sort/basic/bubble/AlgBubbleSort2.html
similarity index 100%
rename from src/lessons/sort/bubble/AlgBubbleSort2.html
rename to src/lessons/sort/basic/bubble/AlgBubbleSort2.html
diff --git a/src/lessons/sort/bubble/AlgBubbleSort2.java b/src/lessons/sort/basic/bubble/AlgBubbleSort2.java
similarity index 94%
rename from src/lessons/sort/bubble/AlgBubbleSort2.java
rename to src/lessons/sort/basic/bubble/AlgBubbleSort2.java
index bcb0bb4..6364c57 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort2.java
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort2.java
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/bubble/AlgBubbleSort2Entity.java b/src/lessons/sort/basic/bubble/AlgBubbleSort2Entity.java
similarity index 91%
rename from src/lessons/sort/bubble/AlgBubbleSort2Entity.java
rename to src/lessons/sort/basic/bubble/AlgBubbleSort2Entity.java
index 009e0ca..9fa73f7 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort2Entity.java
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort2Entity.java
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/bubble/AlgBubbleSort2Entity.py b/src/lessons/sort/basic/bubble/AlgBubbleSort2Entity.py
similarity index 100%
rename from src/lessons/sort/bubble/AlgBubbleSort2Entity.py
rename to src/lessons/sort/basic/bubble/AlgBubbleSort2Entity.py
diff --git a/src/lessons/sort/bubble/AlgBubbleSort2Entity.scala b/src/lessons/sort/basic/bubble/AlgBubbleSort2Entity.scala
similarity index 91%
rename from src/lessons/sort/bubble/AlgBubbleSort2Entity.scala
rename to src/lessons/sort/basic/bubble/AlgBubbleSort2Entity.scala
index ccaca8c..4a70cb3 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort2Entity.scala
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort2Entity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/bubble/AlgBubbleSort3.fr.html b/src/lessons/sort/basic/bubble/AlgBubbleSort3.fr.html
similarity index 65%
rename from src/lessons/sort/bubble/AlgBubbleSort3.fr.html
rename to src/lessons/sort/basic/bubble/AlgBubbleSort3.fr.html
index 03f57e3..251f2ae 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort3.fr.html
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort3.fr.html
@@ -4,12 +4,14 @@
 l'étape précédente : Si un parcours n'a rien inversé, c'est que le tableau
 est maintenant trié. Dans ce cas, il faut arrêter le processus de tri.</p>
 
-<p>Pour cela, utilisez simplement le mot-clé <code>break></code>, qui coupe
-l'exécutino de la boucle englobante. Attention, si vous avez plusieurs
-boucles
-imbriquées, c'est celle situé tout au fond (au plus près du mot-clé break)
-qui
-est cassée.</p>
+<p>
+  [!java|python]Pour cela, utilisez simplement le mot-clé <code>break></code>,
+qui coupe l'exécution de la boucle englobante. Attention, si vous avez
+plusieurs boucles imbriquées, c'est celle situé tout au fond (au plus près
+du mot-clé break) qui est cassée.[/!]
+[!scala]Pour cela, quitez simplement la fonction courante en appellant
+<code>return</code> sans lui associer de valeur.[/!] 
+</p>
 
 <div class="tip" id="tip-3" alt="Si vous le désirez, cet indice montre le pseudo-code.">
 <p></p>
diff --git a/src/lessons/sort/bubble/AlgBubbleSort3.html b/src/lessons/sort/basic/bubble/AlgBubbleSort3.html
similarity index 68%
rename from src/lessons/sort/bubble/AlgBubbleSort3.html
rename to src/lessons/sort/basic/bubble/AlgBubbleSort3.html
index 69607b1..24d25a9 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort3.html
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort3.html
@@ -4,8 +4,11 @@
 if a traversal does not swap any element, it means that the array is already
 sorted. In that case, we want to stop the whole sorting process.</p>
 
-<p>For that, simply use the <code>break</code> keyword, which breaks the current loop. 
-Beware, if you have several embedded loops, this will apply to the internal one.</p>
+<p>
+  [!java|python]For that, simply use the <code>break</code> keyword, which breaks the current loop.
+                Beware, if you have several embedded loops, this will apply to the internal one.[/!]
+  [!scala]For that, simply quit the current function by calling <code>return</code> with no associated value.[/!] 
+</p>
 
 <div class="tip" id="tip-3" alt="If you want, this tip shows the pseudo-code.">
 <p></p>
diff --git a/src/lessons/sort/bubble/AlgBubbleSort3.java b/src/lessons/sort/basic/bubble/AlgBubbleSort3.java
similarity index 94%
rename from src/lessons/sort/bubble/AlgBubbleSort3.java
rename to src/lessons/sort/basic/bubble/AlgBubbleSort3.java
index b544ca0..456606e 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort3.java
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort3.java
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/bubble/AlgBubbleSort3Entity.java b/src/lessons/sort/basic/bubble/AlgBubbleSort3Entity.java
similarity index 93%
rename from src/lessons/sort/bubble/AlgBubbleSort3Entity.java
rename to src/lessons/sort/basic/bubble/AlgBubbleSort3Entity.java
index f867403..fe4a8bc 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort3Entity.java
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort3Entity.java
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/bubble/AlgBubbleSort3Entity.py b/src/lessons/sort/basic/bubble/AlgBubbleSort3Entity.py
similarity index 100%
rename from src/lessons/sort/bubble/AlgBubbleSort3Entity.py
rename to src/lessons/sort/basic/bubble/AlgBubbleSort3Entity.py
diff --git a/src/lessons/sort/bubble/AlgBubbleSort3Entity.scala b/src/lessons/sort/basic/bubble/AlgBubbleSort3Entity.scala
similarity index 93%
rename from src/lessons/sort/bubble/AlgBubbleSort3Entity.scala
rename to src/lessons/sort/basic/bubble/AlgBubbleSort3Entity.scala
index cb26cb0..e364e80 100644
--- a/src/lessons/sort/bubble/AlgBubbleSort3Entity.scala
+++ b/src/lessons/sort/basic/bubble/AlgBubbleSort3Entity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.bubble;
+package lessons.sort.basic.bubble
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort1.fr.html b/src/lessons/sort/basic/cocktail/AlgCocktailSort1.fr.html
similarity index 100%
rename from src/lessons/sort/cocktail/AlgCocktailSort1.fr.html
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort1.fr.html
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort1.html b/src/lessons/sort/basic/cocktail/AlgCocktailSort1.html
similarity index 100%
rename from src/lessons/sort/cocktail/AlgCocktailSort1.html
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort1.html
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort1.java b/src/lessons/sort/basic/cocktail/AlgCocktailSort1.java
similarity index 94%
rename from src/lessons/sort/cocktail/AlgCocktailSort1.java
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort1.java
index c996e59..a509e64 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort1.java
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort1.java
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort1Entity.java b/src/lessons/sort/basic/cocktail/AlgCocktailSort1Entity.java
similarity index 93%
rename from src/lessons/sort/cocktail/AlgCocktailSort1Entity.java
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort1Entity.java
index f8f985e..832ff96 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort1Entity.java
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort1Entity.java
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort1Entity.py b/src/lessons/sort/basic/cocktail/AlgCocktailSort1Entity.py
similarity index 100%
rename from src/lessons/sort/cocktail/AlgCocktailSort1Entity.py
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort1Entity.py
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort1Entity.scala b/src/lessons/sort/basic/cocktail/AlgCocktailSort1Entity.scala
similarity index 93%
rename from src/lessons/sort/cocktail/AlgCocktailSort1Entity.scala
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort1Entity.scala
index b204953..4747e8e 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort1Entity.scala
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort1Entity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort2.fr.html b/src/lessons/sort/basic/cocktail/AlgCocktailSort2.fr.html
similarity index 85%
rename from src/lessons/sort/cocktail/AlgCocktailSort2.fr.html
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort2.fr.html
index 0fd428b..4bf64b4 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort2.fr.html
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort2.fr.html
@@ -9,9 +9,9 @@ debut=0; fin=lgr-2
 Faire
   Pour tout i dans [debut,fin], faire:
     si i et i+1 doivent être échangées, le faire
-  fin--
+  fin -= 1 (cela veut dire fin = fin -1)
   Pour tout i dans [fin, debut] en descendant, faire:
     si i et i+1 doivent être échangées, le faire
-  debut++
+  debut += 1 (ce qui veut dire debut = debut + 1)
 tant qu'au moins l'un des parcours a inversé un élément
 </pre>
\ No newline at end of file
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort2.html b/src/lessons/sort/basic/cocktail/AlgCocktailSort2.html
similarity index 86%
rename from src/lessons/sort/cocktail/AlgCocktailSort2.html
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort2.html
index c7e1ca5..b83b3cb 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort2.html
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort2.html
@@ -9,9 +9,9 @@ beg=0; end=len-2
 do
   For all Pour i in [beg,end], do:
       If cells i and i+1 must be swapped, do it    
-  end--
+  end -= 1 (this means end = end - 1)
   For all Pour i in [beg,end] (downwards), do:
       If cells i and i+1 must be swapped, do it    
-  beg++
+  beg += 1 (this means beg = beg + 1)
 while at least one of the traversal swapped an element
 </pre>
\ No newline at end of file
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort2.java b/src/lessons/sort/basic/cocktail/AlgCocktailSort2.java
similarity index 94%
rename from src/lessons/sort/cocktail/AlgCocktailSort2.java
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort2.java
index d53658a..1513fa2 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort2.java
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort2.java
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort2Entity.java b/src/lessons/sort/basic/cocktail/AlgCocktailSort2Entity.java
similarity index 94%
rename from src/lessons/sort/cocktail/AlgCocktailSort2Entity.java
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort2Entity.java
index 42e2110..821d32b 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort2Entity.java
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort2Entity.java
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort2Entity.py b/src/lessons/sort/basic/cocktail/AlgCocktailSort2Entity.py
similarity index 100%
rename from src/lessons/sort/cocktail/AlgCocktailSort2Entity.py
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort2Entity.py
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort2Entity.scala b/src/lessons/sort/basic/cocktail/AlgCocktailSort2Entity.scala
similarity index 94%
rename from src/lessons/sort/cocktail/AlgCocktailSort2Entity.scala
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort2Entity.scala
index bb1e019..12cef34 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort2Entity.scala
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort2Entity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort3.fr.html b/src/lessons/sort/basic/cocktail/AlgCocktailSort3.fr.html
similarity index 72%
rename from src/lessons/sort/cocktail/AlgCocktailSort3.fr.html
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort3.fr.html
index ebb76f4..122d80d 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort3.fr.html
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort3.fr.html
@@ -4,5 +4,5 @@
 à bulle, il semble bien mieux s'en tirer en pratique. On peut encore
 l'améliorer un tout petit peu en arretant tout si le parcours dans l'ordre
 croissant n'a rien inversé, sans faire le parcours dans l'ordre
-descroissant. De même, on peut quiter si le parcours croissant a inversé des
-choses, mais pas le parcours décroissant.</p> 
\ No newline at end of file
+descroissant. De même, on peut quitter si le parcours croissant a inversé
+des choses, mais pas le parcours décroissant.</p> 
\ No newline at end of file
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort3.html b/src/lessons/sort/basic/cocktail/AlgCocktailSort3.html
similarity index 100%
rename from src/lessons/sort/cocktail/AlgCocktailSort3.html
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort3.html
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort3.java b/src/lessons/sort/basic/cocktail/AlgCocktailSort3.java
similarity index 94%
rename from src/lessons/sort/cocktail/AlgCocktailSort3.java
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort3.java
index 7fd4097..cd2a999 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort3.java
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort3.java
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort3Entity.java b/src/lessons/sort/basic/cocktail/AlgCocktailSort3Entity.java
similarity index 94%
rename from src/lessons/sort/cocktail/AlgCocktailSort3Entity.java
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort3Entity.java
index fe4e591..45a9754 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort3Entity.java
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort3Entity.java
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort3Entity.py b/src/lessons/sort/basic/cocktail/AlgCocktailSort3Entity.py
similarity index 100%
rename from src/lessons/sort/cocktail/AlgCocktailSort3Entity.py
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort3Entity.py
diff --git a/src/lessons/sort/cocktail/AlgCocktailSort3Entity.scala b/src/lessons/sort/basic/cocktail/AlgCocktailSort3Entity.scala
similarity index 94%
rename from src/lessons/sort/cocktail/AlgCocktailSort3Entity.scala
rename to src/lessons/sort/basic/cocktail/AlgCocktailSort3Entity.scala
index 92abbff..eeb2473 100644
--- a/src/lessons/sort/cocktail/AlgCocktailSort3Entity.scala
+++ b/src/lessons/sort/basic/cocktail/AlgCocktailSort3Entity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.cocktail;
+package lessons.sort.basic.cocktail
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/comb/AlgCombSort.fr.html b/src/lessons/sort/basic/comb/AlgCombSort.fr.html
similarity index 75%
rename from src/lessons/sort/comb/AlgCombSort.fr.html
rename to src/lessons/sort/basic/comb/AlgCombSort.fr.html
index 7ed9476..66dec71 100644
--- a/src/lessons/sort/comb/AlgCombSort.fr.html
+++ b/src/lessons/sort/basic/comb/AlgCombSort.fr.html
@@ -20,13 +20,14 @@ fois amène de bons résultats. Voici le pseudo-code correspondant :</p>
    i = O
    tant que i+ecart < lgr faire:
      si i et i+ecart doivent être inversés, le faire
-     ajouter ecart à i
+     incrémenter i de 1
  tant que l'écart est plus grand que 1 ou que le dernier parcours a inversé au moins un élément
 </pre>
 
 [!scala]<p>L'un des problèmes à résoudre est que la variable <code>ecart</code> est
-entière, et que nous voulons la diviser par 1.3, qui est un double. Le
-système de types de scala ne vous laissera pas faire une chose pareil sans
+entière (de type <code>Int</code>), et que nous voulons la diviser par 1.3,
+qui est un nombre à virgule (de type <code>Double</code>). Le système de
+types de scala ne vous laissera pas faire une chose pareil sans
 broncher. C'est que ce genre de disparité est souvent le signe de problèmes
 que le programmeur n'a pas vu. Comme ce n'est pas une erreur dans notre cas,
 nous allons devoir convertir <code>ecart</code> en double pour le temps de
@@ -37,7 +38,13 @@ dans <code>ecart</code>. Cela s'écrit de la manière suivante:</p>
 complexe. Et n'oubliez pas que le système de types est votre ami. Il est un
 peu tatillon et parfois un peu pénible (comme aujourd'hui), mais au fond, il
 trouve souvent des bugs bizarres qui auraient été très pénibles à débugger
-s'il ne les avait pas attrapé à la source.</p>
+s'il ne les avait pas attrapé à la source. Et comme de plus les auteurs de
+Scala sont pragmatiques, cela peut aussi de manière simplifiée :</p>
+<pre>ecart = (ecart.toDouble / 1.3).toInt</pre>
+<p><code>toDouble</code> et <code>toInt</code> sont simplement des raccourcis
+pour les expressions équivalentes <code>asInstanceOf[Double]</code> et
+<code>asInstanceOf[Int]</code>. Ce n'est pas très générique, mais c'est
+extrêmement pratique.</p>
 [/!]
 
 <p>Cet algorithme a été inventé par Wlodek Dobosiewicz en 1980 et redécouvert
diff --git a/src/lessons/sort/comb/AlgCombSort.html b/src/lessons/sort/basic/comb/AlgCombSort.html
similarity index 76%
rename from src/lessons/sort/comb/AlgCombSort.html
rename to src/lessons/sort/basic/comb/AlgCombSort.html
index 3f91ea7..6f834d1 100644
--- a/src/lessons/sort/comb/AlgCombSort.html
+++ b/src/lessons/sort/basic/comb/AlgCombSort.html
@@ -19,18 +19,22 @@ do
    i = O
    while i+gap < len do:
      if i and i+gap must be swapped, do it
-     increase i by the gap
+     increase i by one
 while the gap is bigger than 1 or the last traversal swapped at least one pair
 </pre>
 
-[!scala]<p>One tricky part is that we want to divide gap, that is an integer, by 1.3, that is a double.
-The type system of scala won't let us do this, because such discrepency usually denotes a programmer error.
+[!scala]<p>One tricky part is that we want to divide gap, that is an integer (of type Int), by 1.3, that is a Double.
+The type system of scala won't let us do this, because such discrepancy usually denotes a programmer error.
 As this is not an error this time, we have to convert gap to Double for the time of the operation, 
 and then convert the result back to Int to store it into gap. This should be written this way:</p>
 <pre>gap = (gap.asInstanceOf[Double] / 1.3).asInstanceOf[Int]</pre>
 <p>This is rather verbose, but actually, this notation is not very complex. And remember that the type checker
 is your friend. It's picky and sometimes annoying (as on this one), but it often catches weird bugs that
-would have been a pain to debug if not catched by the type checker.</p>
+would have been a pain to debug if not catch by the type checker. And since the Scala's authors are pragmatic, 
+the previous expression can be simplified:</p>
+<pre>gap = (gap.toDouble / 1.3).toInt</pre>
+<p><code>toDouble</code> and <code>toInt</code> are just shortcuts for the corresponding expressions 
+<code>asInstanceOf[Double]</code> and <code>asInstanceOf[Int]</code>. It's not very generic, but it's very handy.</p>
 [/!]
 
 <p>This algorithm was invented by Wlodek Dobosiewicz in 1980, and later
diff --git a/src/lessons/sort/comb/AlgCombSort.java b/src/lessons/sort/basic/comb/AlgCombSort.java
similarity index 94%
rename from src/lessons/sort/comb/AlgCombSort.java
rename to src/lessons/sort/basic/comb/AlgCombSort.java
index 98ce91c..5451df0 100644
--- a/src/lessons/sort/comb/AlgCombSort.java
+++ b/src/lessons/sort/basic/comb/AlgCombSort.java
@@ -1,4 +1,4 @@
-package lessons.sort.comb;
+package lessons.sort.basic.comb;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/comb/AlgCombSort11.fr.html b/src/lessons/sort/basic/comb/AlgCombSort11.fr.html
similarity index 100%
rename from src/lessons/sort/comb/AlgCombSort11.fr.html
rename to src/lessons/sort/basic/comb/AlgCombSort11.fr.html
diff --git a/src/lessons/sort/comb/AlgCombSort11.html b/src/lessons/sort/basic/comb/AlgCombSort11.html
similarity index 100%
rename from src/lessons/sort/comb/AlgCombSort11.html
rename to src/lessons/sort/basic/comb/AlgCombSort11.html
diff --git a/src/lessons/sort/comb/AlgCombSort11.java b/src/lessons/sort/basic/comb/AlgCombSort11.java
similarity index 94%
rename from src/lessons/sort/comb/AlgCombSort11.java
rename to src/lessons/sort/basic/comb/AlgCombSort11.java
index ee9d6d3..b5c4be8 100644
--- a/src/lessons/sort/comb/AlgCombSort11.java
+++ b/src/lessons/sort/basic/comb/AlgCombSort11.java
@@ -1,4 +1,4 @@
-package lessons.sort.comb;
+package lessons.sort.basic.comb;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/comb/AlgCombSort11Entity.java b/src/lessons/sort/basic/comb/AlgCombSort11Entity.java
similarity index 94%
rename from src/lessons/sort/comb/AlgCombSort11Entity.java
rename to src/lessons/sort/basic/comb/AlgCombSort11Entity.java
index fd7a25c..7f12771 100644
--- a/src/lessons/sort/comb/AlgCombSort11Entity.java
+++ b/src/lessons/sort/basic/comb/AlgCombSort11Entity.java
@@ -1,4 +1,4 @@
-package lessons.sort.comb;
+package lessons.sort.basic.comb;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/comb/AlgCombSort11Entity.py b/src/lessons/sort/basic/comb/AlgCombSort11Entity.py
similarity index 100%
rename from src/lessons/sort/comb/AlgCombSort11Entity.py
rename to src/lessons/sort/basic/comb/AlgCombSort11Entity.py
diff --git a/src/lessons/sort/comb/AlgCombSort11Entity.scala b/src/lessons/sort/basic/comb/AlgCombSort11Entity.scala
similarity index 95%
rename from src/lessons/sort/comb/AlgCombSort11Entity.scala
rename to src/lessons/sort/basic/comb/AlgCombSort11Entity.scala
index 1630f8e..fc763a8 100644
--- a/src/lessons/sort/comb/AlgCombSort11Entity.scala
+++ b/src/lessons/sort/basic/comb/AlgCombSort11Entity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.comb;
+package lessons.sort.basic.comb
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/comb/AlgCombSortEntity.java b/src/lessons/sort/basic/comb/AlgCombSortEntity.java
similarity index 94%
rename from src/lessons/sort/comb/AlgCombSortEntity.java
rename to src/lessons/sort/basic/comb/AlgCombSortEntity.java
index 1b75713..670de74 100644
--- a/src/lessons/sort/comb/AlgCombSortEntity.java
+++ b/src/lessons/sort/basic/comb/AlgCombSortEntity.java
@@ -1,4 +1,4 @@
-package lessons.sort.comb;
+package lessons.sort.basic.comb;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/comb/AlgCombSortEntity.py b/src/lessons/sort/basic/comb/AlgCombSortEntity.py
similarity index 100%
rename from src/lessons/sort/comb/AlgCombSortEntity.py
rename to src/lessons/sort/basic/comb/AlgCombSortEntity.py
diff --git a/src/lessons/sort/comb/AlgCombSortEntity.scala b/src/lessons/sort/basic/comb/AlgCombSortEntity.scala
similarity index 84%
rename from src/lessons/sort/comb/AlgCombSortEntity.scala
rename to src/lessons/sort/basic/comb/AlgCombSortEntity.scala
index c07410c..314b223 100644
--- a/src/lessons/sort/comb/AlgCombSortEntity.scala
+++ b/src/lessons/sort/basic/comb/AlgCombSortEntity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.comb;
+package lessons.sort.basic.comb
 
 import plm.universe.sort.SortingEntity;
 
@@ -15,7 +15,7 @@ class ScalaAlgCombSortEntity extends SortingEntity {
 		var swapped=false;
 		do {
 			if (gap>1) 
-				gap = (gap.asInstanceOf[Double] / 1.3).asInstanceOf[Int];
+				gap = (gap.toDouble / 1.3).toInt;
 			swapped = false;
 			for (i <- 0 to getValueCount()-gap-1)
 				if (!isSmaller(i,i+gap)) {
diff --git a/src/lessons/sort/gnome/AlgGnomeSort.fr.html b/src/lessons/sort/basic/gnome/AlgGnomeSort.fr.html
similarity index 100%
rename from src/lessons/sort/gnome/AlgGnomeSort.fr.html
rename to src/lessons/sort/basic/gnome/AlgGnomeSort.fr.html
diff --git a/src/lessons/sort/gnome/AlgGnomeSort.html b/src/lessons/sort/basic/gnome/AlgGnomeSort.html
similarity index 100%
rename from src/lessons/sort/gnome/AlgGnomeSort.html
rename to src/lessons/sort/basic/gnome/AlgGnomeSort.html
diff --git a/src/lessons/sort/gnome/AlgGnomeSort.java b/src/lessons/sort/basic/gnome/AlgGnomeSort.java
similarity index 94%
rename from src/lessons/sort/gnome/AlgGnomeSort.java
rename to src/lessons/sort/basic/gnome/AlgGnomeSort.java
index ce2341e..0b298ac 100644
--- a/src/lessons/sort/gnome/AlgGnomeSort.java
+++ b/src/lessons/sort/basic/gnome/AlgGnomeSort.java
@@ -1,4 +1,4 @@
-package lessons.sort.gnome;
+package lessons.sort.basic.gnome;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/gnome/AlgGnomeSortEntity.java b/src/lessons/sort/basic/gnome/AlgGnomeSortEntity.java
similarity index 76%
rename from src/lessons/sort/gnome/AlgGnomeSortEntity.java
rename to src/lessons/sort/basic/gnome/AlgGnomeSortEntity.java
index 8497d5b..9930471 100644
--- a/src/lessons/sort/gnome/AlgGnomeSortEntity.java
+++ b/src/lessons/sort/basic/gnome/AlgGnomeSortEntity.java
@@ -1,4 +1,4 @@
-package lessons.sort.gnome;
+package lessons.sort.basic.gnome;
 
 import plm.universe.sort.SortingEntity;
 
@@ -20,7 +20,7 @@ public class AlgGnomeSortEntity extends SortingEntity {
 				i--;
 			}
 			if (i==-1)
-				i=0;
+				i=1; // Remaining at 0 would not mean "move forward" as stated in the mission text
 		}
 		/* END SOLUTION */
 	}
diff --git a/src/lessons/sort/gnome/AlgGnomeSortEntity.py b/src/lessons/sort/basic/gnome/AlgGnomeSortEntity.py
similarity index 63%
rename from src/lessons/sort/gnome/AlgGnomeSortEntity.py
rename to src/lessons/sort/basic/gnome/AlgGnomeSortEntity.py
index d66c57d..19ecd23 100644
--- a/src/lessons/sort/gnome/AlgGnomeSortEntity.py
+++ b/src/lessons/sort/basic/gnome/AlgGnomeSortEntity.py
@@ -7,5 +7,5 @@ while i < getValueCount()-1:
 		swap(i,i+1)
 		i -=  1
 	if i == -1:
-		i=0
+		i=1 # Remaining at 0 would not mean "move forward" as stated in the mission text
 # END SOLUTION
diff --git a/src/lessons/sort/gnome/AlgGnomeSortEntity.scala b/src/lessons/sort/basic/gnome/AlgGnomeSortEntity.scala
similarity index 76%
rename from src/lessons/sort/gnome/AlgGnomeSortEntity.scala
rename to src/lessons/sort/basic/gnome/AlgGnomeSortEntity.scala
index 2e3c6b5..9e33c11 100644
--- a/src/lessons/sort/gnome/AlgGnomeSortEntity.scala
+++ b/src/lessons/sort/basic/gnome/AlgGnomeSortEntity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.gnome;
+package lessons.sort.basic.gnome
 
 import plm.universe.sort.SortingEntity;
 
@@ -20,7 +20,7 @@ class ScalaAlgGnomeSortEntity extends SortingEntity {
 				i-=1;
 			}
 			if (i == -1)
-				i=0;
+				i=1 // Remaining at 0 would not mean "move forward" as stated in the mission text 
 		}
 		/* END SOLUTION */
 	}
diff --git a/src/lessons/sort/icon.png b/src/lessons/sort/basic/icon.png
similarity index 100%
rename from src/lessons/sort/icon.png
rename to src/lessons/sort/basic/icon.png
diff --git a/src/lessons/sort/insertion/AlgInsertionSort.fr.html b/src/lessons/sort/basic/insertion/AlgInsertionSort.fr.html
similarity index 86%
rename from src/lessons/sort/insertion/AlgInsertionSort.fr.html
rename to src/lessons/sort/basic/insertion/AlgInsertionSort.fr.html
index 7366134..c65b7c9 100644
--- a/src/lessons/sort/insertion/AlgInsertionSort.fr.html
+++ b/src/lessons/sort/basic/insertion/AlgInsertionSort.fr.html
@@ -13,21 +13,21 @@ sa place dans la partie du tableau déjà trié.  Lorsque l'on regarde un
 à gauche du tableau sont déjà triés, et il faut insérer x à sa place dans le
 tableau.</p>
 <div style="text-align:center">
-	<img src="lessons/sort/insertion/InsertionsortBefore.png"/>
+	<img src="./InsertionsortBefore.png"/>
 </div>
 <p>Une fois ceci fait, on se retrouve dans la situation suivante:</p>
 <div style="text-align:center">
-	<img src="lessons/sort/insertion/InsertionsortAfter.png"/>
+	<img src="./InsertionsortAfter.png"/>
 </div>
 <p>Le pseudo-code de cet algorithme est donc le suivant :</p>
-<pre>Pour tout i dans [1,lgr]
-  stoquer la valeur de la case i dans une variable val
-  recopier la case i-1 dans i, si i-1 contient une valeur plus grande que val
-  recopier la case i-2 dans i-1, si i-2 contient une valeur plus grande que val  
-  recopier la case i-3 dans i-2, si i-3 contient une valeur plus grande que val  
-  recopier la case i-4 dans i-3, si i-4 contient une valeur plus grande que val
+<pre>Pour tout i dans [1,lgr-1]
+  stocker la valeur de la case i dans une variable v
+  recopier la case i-1 dans i, si i-1 contient une valeur plus grande que v
+  recopier la case i-2 dans i-1, si i-2 contient une valeur plus grande que v
+  recopier la case i-3 dans i-2, si i-3 contient une valeur plus grande que v
+  recopier la case i-4 dans i-3, si i-4 contient une valeur plus grande que v
   ...
-  recopier val dans la dernière case recopiée plus haut
+  recopier v dans la dernière case recopiée plus haut
 </pre>
 <p>
 Bien entendu, il faut utiliser une boucle pour écrire la grosse permutation
@@ -52,7 +52,7 @@ qui fait des paquets des valeurs et trie ensuite chaque paquet. Cet
 algorithme présente un pire cas en O(nlog n), et une complexité spatiale en
 O(n).  LibrarySort (proposé en 2004) échange également un peu d'espace pour
 du temps puisqu'il présente une complexité moyenne en O(n log n), mais
-nécessite de stoquer des données supplémentaires.</p>
+nécessite de stocker des données supplémentaires.</p>
  
 <p>Wikipedia (en anglais) propose une description détaillée de tous ces
 algorithmes que nous n'avons pas le temps de détailler ici.</p> 
diff --git a/src/lessons/sort/insertion/AlgInsertionSort.html b/src/lessons/sort/basic/insertion/AlgInsertionSort.html
similarity index 88%
rename from src/lessons/sort/insertion/AlgInsertionSort.html
rename to src/lessons/sort/basic/insertion/AlgInsertionSort.html
index 0f7bbe2..6992d75 100644
--- a/src/lessons/sort/insertion/AlgInsertionSort.html
+++ b/src/lessons/sort/basic/insertion/AlgInsertionSort.html
@@ -12,21 +12,21 @@ we look at an element x, the situation is the following: any elements to the
 left of the array are already sorted, and we have to insert x at its
 position in the array.</p>
 <div style="text-align:center">
-	<img src="lessons/sort/insertion/InsertionsortBefore.png"/>
+	<img src="./InsertionsortBefore.png"/>
 </div>
 <p>Once this is done, the situation is the following:</p>
 <div style="text-align:center">
-	<img src="lessons/sort/insertion/InsertionsortAfter.png"/>
+	<img src="./InsertionsortAfter.png"/>
 </div>
 <p>The pseudo-code of this algorithm is thus the following:</p>
-<pre>For each i in [1,len]
-  store the value of i in a variable val
-  copy the cell i-1 into i if i-1 contains a value bigger than val
-  copy the cell i-2 into i-1 if i-2 contains a value bigger than val
-  copy the cell i-3 into i-2 if i-3 contains a value bigger than val
-  copy the cell i-4 into i-3 if i-4 contains a value bigger than val
+<pre>For each i in [1,len-1]
+  store the value of i in a variable v
+  copy the cell i-1 into i if i-1 contains a value bigger than v
+  copy the cell i-2 into i-1 if i-2 contains a value bigger than v
+  copy the cell i-3 into i-2 if i-3 contains a value bigger than v
+  copy the cell i-4 into i-3 if i-4 contains a value bigger than v
   ...
-  copy val into the last cell copied above
+  copy v into the last cell copied above
 </pre>
 <p>
 Naturally, you should use a loop to write the big permutation within the
diff --git a/src/lessons/sort/insertion/AlgInsertionSort.java b/src/lessons/sort/basic/insertion/AlgInsertionSort.java
similarity index 93%
rename from src/lessons/sort/insertion/AlgInsertionSort.java
rename to src/lessons/sort/basic/insertion/AlgInsertionSort.java
index 84deeb0..6b3d6e7 100644
--- a/src/lessons/sort/insertion/AlgInsertionSort.java
+++ b/src/lessons/sort/basic/insertion/AlgInsertionSort.java
@@ -1,4 +1,4 @@
-package lessons.sort.insertion;
+package lessons.sort.basic.insertion;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/insertion/AlgInsertionSortEntity.java b/src/lessons/sort/basic/insertion/AlgInsertionSortEntity.java
similarity index 92%
rename from src/lessons/sort/insertion/AlgInsertionSortEntity.java
rename to src/lessons/sort/basic/insertion/AlgInsertionSortEntity.java
index 878a578..8eea4b9 100644
--- a/src/lessons/sort/insertion/AlgInsertionSortEntity.java
+++ b/src/lessons/sort/basic/insertion/AlgInsertionSortEntity.java
@@ -1,4 +1,4 @@
-package lessons.sort.insertion;
+package lessons.sort.basic.insertion;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/insertion/AlgInsertionSortEntity.py b/src/lessons/sort/basic/insertion/AlgInsertionSortEntity.py
similarity index 100%
rename from src/lessons/sort/insertion/AlgInsertionSortEntity.py
rename to src/lessons/sort/basic/insertion/AlgInsertionSortEntity.py
diff --git a/src/lessons/sort/insertion/AlgInsertionSortEntity.scala b/src/lessons/sort/basic/insertion/AlgInsertionSortEntity.scala
similarity index 92%
rename from src/lessons/sort/insertion/AlgInsertionSortEntity.scala
rename to src/lessons/sort/basic/insertion/AlgInsertionSortEntity.scala
index d5409e2..d4e0395 100644
--- a/src/lessons/sort/insertion/AlgInsertionSortEntity.scala
+++ b/src/lessons/sort/basic/insertion/AlgInsertionSortEntity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.insertion;
+package lessons.sort.basic.insertion
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/insertion/InsertionsortAfter.png b/src/lessons/sort/basic/insertion/InsertionsortAfter.png
similarity index 100%
rename from src/lessons/sort/insertion/InsertionsortAfter.png
rename to src/lessons/sort/basic/insertion/InsertionsortAfter.png
diff --git a/src/lessons/sort/insertion/InsertionsortBefore.png b/src/lessons/sort/basic/insertion/InsertionsortBefore.png
similarity index 100%
rename from src/lessons/sort/insertion/InsertionsortBefore.png
rename to src/lessons/sort/basic/insertion/InsertionsortBefore.png
diff --git a/src/lessons/sort/selection/AlgSelectionSort.fr.html b/src/lessons/sort/basic/selection/AlgSelectionSort.fr.html
similarity index 100%
rename from src/lessons/sort/selection/AlgSelectionSort.fr.html
rename to src/lessons/sort/basic/selection/AlgSelectionSort.fr.html
diff --git a/src/lessons/sort/selection/AlgSelectionSort.html b/src/lessons/sort/basic/selection/AlgSelectionSort.html
similarity index 100%
rename from src/lessons/sort/selection/AlgSelectionSort.html
rename to src/lessons/sort/basic/selection/AlgSelectionSort.html
diff --git a/src/lessons/sort/selection/AlgSelectionSort.java b/src/lessons/sort/basic/selection/AlgSelectionSort.java
similarity index 94%
rename from src/lessons/sort/selection/AlgSelectionSort.java
rename to src/lessons/sort/basic/selection/AlgSelectionSort.java
index eb7ff3d..106dec7 100644
--- a/src/lessons/sort/selection/AlgSelectionSort.java
+++ b/src/lessons/sort/basic/selection/AlgSelectionSort.java
@@ -1,4 +1,4 @@
-package lessons.sort.selection;
+package lessons.sort.basic.selection;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/selection/AlgSelectionSortEntity.java b/src/lessons/sort/basic/selection/AlgSelectionSortEntity.java
similarity index 94%
rename from src/lessons/sort/selection/AlgSelectionSortEntity.java
rename to src/lessons/sort/basic/selection/AlgSelectionSortEntity.java
index 62e7152..a7fe959 100644
--- a/src/lessons/sort/selection/AlgSelectionSortEntity.java
+++ b/src/lessons/sort/basic/selection/AlgSelectionSortEntity.java
@@ -1,4 +1,4 @@
-package lessons.sort.selection;
+package lessons.sort.basic.selection;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/selection/AlgSelectionSortEntity.py b/src/lessons/sort/basic/selection/AlgSelectionSortEntity.py
similarity index 100%
rename from src/lessons/sort/selection/AlgSelectionSortEntity.py
rename to src/lessons/sort/basic/selection/AlgSelectionSortEntity.py
diff --git a/src/lessons/sort/selection/AlgSelectionSortEntity.scala b/src/lessons/sort/basic/selection/AlgSelectionSortEntity.scala
similarity index 93%
rename from src/lessons/sort/selection/AlgSelectionSortEntity.scala
rename to src/lessons/sort/basic/selection/AlgSelectionSortEntity.scala
index 0d27d6c..21eb174 100644
--- a/src/lessons/sort/selection/AlgSelectionSortEntity.scala
+++ b/src/lessons/sort/basic/selection/AlgSelectionSortEntity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.selection;
+package lessons.sort.basic.selection
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/shell/AlgShellSort.fr.html b/src/lessons/sort/basic/shell/AlgShellSort.fr.html
similarity index 100%
rename from src/lessons/sort/shell/AlgShellSort.fr.html
rename to src/lessons/sort/basic/shell/AlgShellSort.fr.html
diff --git a/src/lessons/sort/shell/AlgShellSort.html b/src/lessons/sort/basic/shell/AlgShellSort.html
similarity index 100%
rename from src/lessons/sort/shell/AlgShellSort.html
rename to src/lessons/sort/basic/shell/AlgShellSort.html
diff --git a/src/lessons/sort/shell/AlgShellSort.java b/src/lessons/sort/basic/shell/AlgShellSort.java
similarity index 94%
rename from src/lessons/sort/shell/AlgShellSort.java
rename to src/lessons/sort/basic/shell/AlgShellSort.java
index da6f732..13d035a 100644
--- a/src/lessons/sort/shell/AlgShellSort.java
+++ b/src/lessons/sort/basic/shell/AlgShellSort.java
@@ -1,4 +1,4 @@
-package lessons.sort.shell;
+package lessons.sort.basic.shell;
 
 import plm.core.model.lesson.ExerciseTemplated;
 import plm.core.model.lesson.Lesson;
diff --git a/src/lessons/sort/shell/AlgShellSortEntity.java b/src/lessons/sort/basic/shell/AlgShellSortEntity.java
similarity index 97%
rename from src/lessons/sort/shell/AlgShellSortEntity.java
rename to src/lessons/sort/basic/shell/AlgShellSortEntity.java
index efbb8e4..11c6528 100644
--- a/src/lessons/sort/shell/AlgShellSortEntity.java
+++ b/src/lessons/sort/basic/shell/AlgShellSortEntity.java
@@ -1,4 +1,4 @@
-package lessons.sort.shell;
+package lessons.sort.basic.shell;
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/shell/AlgShellSortEntity.py b/src/lessons/sort/basic/shell/AlgShellSortEntity.py
similarity index 100%
rename from src/lessons/sort/shell/AlgShellSortEntity.py
rename to src/lessons/sort/basic/shell/AlgShellSortEntity.py
diff --git a/src/lessons/sort/shell/AlgShellSortEntity.scala b/src/lessons/sort/basic/shell/AlgShellSortEntity.scala
similarity index 97%
rename from src/lessons/sort/shell/AlgShellSortEntity.scala
rename to src/lessons/sort/basic/shell/AlgShellSortEntity.scala
index aa253d8..13efdb3 100644
--- a/src/lessons/sort/shell/AlgShellSortEntity.scala
+++ b/src/lessons/sort/basic/shell/AlgShellSortEntity.scala
@@ -1,4 +1,4 @@
-package lessons.sort.shell;
+package lessons.sort.basic.shell
 
 import plm.universe.sort.SortingEntity;
 
diff --git a/src/lessons/sort/short_desc.fr.html b/src/lessons/sort/basic/short_desc.fr.html
similarity index 100%
rename from src/lessons/sort/short_desc.fr.html
rename to src/lessons/sort/basic/short_desc.fr.html
diff --git a/src/lessons/sort/short_desc.html b/src/lessons/sort/basic/short_desc.html
similarity index 100%
rename from src/lessons/sort/short_desc.html
rename to src/lessons/sort/basic/short_desc.html
diff --git a/src/lessons/sort/dutchflag/DutchFlagAlgo.html b/src/lessons/sort/dutchflag/DutchFlagAlgo.html
new file mode 100644
index 0000000..3ef5718
--- /dev/null
+++ b/src/lessons/sort/dutchflag/DutchFlagAlgo.html
@@ -0,0 +1,21 @@
+<h1>The Dutch Flag Problem</h1>
+
+<p>Your work is to sort all the colors of the Dutch flag, and the only provided primitive is to exchange two given lines. 
+In addition, you should not create any additional variables (but a few indices).</p>
+
+<p>If you think carefully, this can be done in linear time, where you sort a line at each iteration of the loop. 
+You may want to check again the <a href="plm://lessons.sort.basic/insertion.AlgInsertionSort">insertion sort</a>, 
+of which the Dutch Flag sort is a variation. The main difference is that you have 3 insertion points, not only one...</p>
+
+ <div class="tip" id="tip-1" alt="I need an hint to start">
+ <p>Do a traversal over your data, saving 3 indices:
+ <ul>
+  <li><code>afterBlue</code> is initialized to 0. Make sure that every cell below <code>afterBlue</code> is filled with blue elements.</li>
+  <li><code>whiteRed</code> is initialized to size-1. Make sure that every cell after <code>whiteRed</code> is filled with red elements.</li>
+  <li><code>beforeWhite</code> is initialized to size-1. Make sure that every cell after <code>beforeWhite</code> and before <code>whiteRed</code> is filled with while elements.</li>
+ </ul> 
+ <p>Note that the unsorted cells are always between <code>afterBlue</code> and <code>beforeWhite</code>.</p>
+ 
+ <p>At each step of your traversal, check the color of the cell at <code>afterBlue</code> and do the required exchanges.
+ The loop ending condition is when <code>afterBlue</code> becomes larger than <code>beforeWhite</code>.</p>
+ </div>
\ No newline at end of file
diff --git a/src/lessons/sort/dutchflag/DutchFlagAlgo.java b/src/lessons/sort/dutchflag/DutchFlagAlgo.java
new file mode 100644
index 0000000..237bd03
--- /dev/null
+++ b/src/lessons/sort/dutchflag/DutchFlagAlgo.java
@@ -0,0 +1,27 @@
+package lessons.sort.dutchflag;
+
+import lessons.sort.dutchflag.universe.DutchFlagWorld;
+import plm.core.model.lesson.ExerciseTemplated;
+import plm.core.model.lesson.Lesson;
+
+public class DutchFlagAlgo extends ExerciseTemplated {
+	
+	public DutchFlagAlgo(Lesson lesson) {
+		super(lesson);
+	
+		setup( new DutchFlagWorld[] {
+				
+				new DutchFlagWorld("6 lines",6),
+				new DutchFlagWorld("12 lines",12),
+				new DutchFlagWorld("18 lines",18),
+				new DutchFlagWorld("36 lines",36),
+				new DutchFlagWorld("300 lines",300),
+				new DutchFlagWorld("12 white/red",12,0), 
+				new DutchFlagWorld("12 blue/red",12,1), 
+				new DutchFlagWorld("12 blue/white",12,2),
+				
+		});
+
+	}
+
+}
diff --git a/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.java b/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.java
new file mode 100644
index 0000000..36471c5
--- /dev/null
+++ b/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.java
@@ -0,0 +1,39 @@
+package lessons.sort.dutchflag;
+
+import lessons.sort.dutchflag.universe.DutchFlagEntity;
+import lessons.sort.dutchflag.universe.DutchFlagWorld;
+
+public class DutchFlagAlgoEntity extends DutchFlagEntity {
+	
+	public void run() {
+		solve();
+	}
+
+	/* BEGIN TEMPLATE */
+	void solve() {
+		/* BEGIN SOLUTION */
+		int afterBlue=0;
+		int beforeWhite=getSize()-1;
+		int beforeRed=getSize()-1;
+		while (afterBlue <= beforeWhite) {
+			
+			switch (getColor(afterBlue)) {
+			case BLUE:
+				afterBlue++;
+				break;
+			case WHITE:
+				swap(afterBlue, beforeWhite);
+				beforeWhite --;
+				break;
+			case RED:
+				swap(afterBlue, beforeWhite);
+				swap(beforeRed, beforeWhite);
+				beforeWhite--;
+				beforeRed--;
+			}
+		}
+		((DutchFlagWorld) world).assertSorted();
+		/* END SOLUTION */
+	}
+	/* END TEMPLATE */
+}
diff --git a/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.py b/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.py
new file mode 100644
index 0000000..88a7a8c
--- /dev/null
+++ b/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.py
@@ -0,0 +1,17 @@
+# BEGIN SOLUTION 
+afterBlue=0;
+beforeWhite=getSize()-1;
+beforeRed=getSize()-1;
+while afterBlue <= beforeWhite:
+	
+	if (getColor(afterBlue) == BLUE):
+		afterBlue += 1
+	elif (getColor(afterBlue) == WHITE):
+		swap(afterBlue, beforeWhite);
+		beforeWhite -= 1
+	else:
+		swap(afterBlue, beforeWhite);
+		swap(beforeRed, beforeWhite);
+		beforeWhite -= 1
+		beforeRed -= 1
+# END SOLUTION
diff --git a/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.scala b/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.scala
new file mode 100644
index 0000000..cdf8876
--- /dev/null
+++ b/src/lessons/sort/dutchflag/DutchFlagAlgoEntity.scala
@@ -0,0 +1,38 @@
+package lessons.sort.dutchflag;
+
+import lessons.sort.dutchflag.universe.DutchFlagEntity._;
+import lessons.sort.dutchflag.universe.DutchFlagEntity;
+import lessons.sort.dutchflag.universe.DutchFlagWorld;
+
+class DutchFlagAlgoEntityScala extends DutchFlagEntity {
+	
+	override def run() {
+		solve();
+	}
+
+	/* BEGIN TEMPLATE */
+	def solve() {
+		/* BEGIN SOLUTION */
+		var afterBlue=0;
+		var beforeWhite=getSize()-1;
+		var beforeRed=getSize()-1;
+		while (afterBlue <= beforeWhite) {
+			
+			getColor(afterBlue) match {
+			case BLUE =>
+				afterBlue += 1
+			case WHITE =>
+				swap(afterBlue, beforeWhite)
+				beforeWhite -= 1
+			case RED =>
+				swap(afterBlue, beforeWhite)
+				swap(beforeRed, beforeWhite)
+				beforeWhite -= 1
+				beforeRed -= 1
+			}
+		}
+		world.asInstanceOf[DutchFlagWorld].assertSorted();
+		/* END SOLUTION */
+	}
+	/* END TEMPLATE */
+}
diff --git a/src/lessons/sort/dutchflag/Main.html b/src/lessons/sort/dutchflag/Main.html
new file mode 100644
index 0000000..a6d871e
--- /dev/null
+++ b/src/lessons/sort/dutchflag/Main.html
@@ -0,0 +1,15 @@
+<h1>The Dutch Flag Problem</h1>
+
+<p>This problem was first proposed by E.W Dijkstra in 1976 (in the chapter 14 of his book "A Discipline of Programming").
+It is a very classical variation of the sorting algorithms since then. It is sometimes useful in real life, but 
+it became famous for its pedagogical properties: its complexity is not trivial, but not complex either. 
+It can easily be formally proven, but it's not absolutely trivial either. </p>  
+
+<h3>What can I do to improve this PLM universe?</h3>
+
+<p>As usual, there are several things that could be done in the code of this universe to improve it:</p>
+<ul>
+  <li>A temporal view could be welcomed.</li>
+  <li>Other exercises, for example with 2 colors only or with more than 3 colors, could generalize the proposed approach.</li>
+  <li>This problem could be solved recursively.</li>
+</ul> 
\ No newline at end of file
diff --git a/src/lessons/sort/dutchflag/Main.java b/src/lessons/sort/dutchflag/Main.java
new file mode 100644
index 0000000..20cbfcb
--- /dev/null
+++ b/src/lessons/sort/dutchflag/Main.java
@@ -0,0 +1,11 @@
+package lessons.sort.dutchflag;
+
+import plm.core.model.lesson.Lesson;
+
+public class Main extends Lesson {
+	@Override
+	protected void loadExercises() {
+		
+		addExercise(new DutchFlagAlgo(this));
+	}
+}
diff --git a/src/lessons/sort/dutchflag/icon.png b/src/lessons/sort/dutchflag/icon.png
new file mode 100644
index 0000000..f780b63
Binary files /dev/null and b/src/lessons/sort/dutchflag/icon.png differ
diff --git a/src/lessons/sort/dutchflag/short_desc.html b/src/lessons/sort/dutchflag/short_desc.html
new file mode 100644
index 0000000..4a60325
--- /dev/null
+++ b/src/lessons/sort/dutchflag/short_desc.html
@@ -0,0 +1,3 @@
+<h3>The Dutch Flag Problem</h3>
+
+<p>This is a classical sorting problem, constituting a variation over the insertion sort.</p>
diff --git a/src/lessons/sort/dutchflag/universe/DutchFlagEntity.java b/src/lessons/sort/dutchflag/universe/DutchFlagEntity.java
new file mode 100644
index 0000000..0605a03
--- /dev/null
+++ b/src/lessons/sort/dutchflag/universe/DutchFlagEntity.java
@@ -0,0 +1,79 @@
+package lessons.sort.dutchflag.universe;
+
+import plm.core.model.Game;
+import plm.universe.Entity;
+import plm.universe.World;
+
+public class DutchFlagEntity extends Entity {
+
+	public final static int BLUE = 0;
+	public final static int WHITE = 1;
+	public final static int RED = 2;
+	
+	/** Required by the PLM infrastructure */
+	public DutchFlagEntity() {
+		super("DutchFlag Entity");
+	}
+
+	/** Copy constructor (used internally) */
+	public DutchFlagEntity(String name) {
+		super(name);
+	}
+	
+	/** Instantiation Constructor (used by exercises to setup the world) */ 
+	public DutchFlagEntity(World world) {
+		super(Game.i18n.tr("Flag sorter"),world);
+	}
+	
+	/**  A copy constructor, needed by the PLM */
+	@Override
+	public Entity copy() {
+		return new DutchFlagEntity(this.name);
+	}
+
+	/** Swap two positions */
+	public void swap(int from, int to) {
+		((DutchFlagWorld) world).swap(from, to);
+		stepUI();
+	}
+
+	/**
+	 * Give the color of of a specific ray in the flag
+	 * @param rank : the number of the ray that you want to get.
+	 * @return The color of that ray (either 0, 1 or 2)
+	 */
+	public int getColor(int rank) {
+		return ((DutchFlagWorld) world).getColor(rank);
+	}
+	
+	/** Returns the amount of rays in this flag */
+	public int getSize() {
+		return ((DutchFlagWorld) world).getSize();
+	}
+		
+	/** Returns whether the flag is correctly sorted */
+	public boolean isSorted() {
+		return ((DutchFlagWorld) world).isSorted();
+	}		
+			
+	/** Must exist so that exercises can instantiate the entity (Entity is abstract) 
+	 */
+	@Override
+	public void run() {
+	}
+	
+	/** Returns a string representation of the world */
+	public String toString(){
+		return "DutchFlagEntity (" + this.getClass().getName() + ")";
+	}
+	
+	/* BINDINGS TRANSLATION: French */
+	public void echange(int i, int j) { swap(i,j); }
+	public int getCouleur(int rank)   { return getColor(rank); }
+	public int getTaille()            { return getSize(); }
+	public boolean estTrie()          { return isSorted(); }
+	public boolean estChoisi()        { return isSelected(); }
+	public final static int BLEU = BLUE;
+	public final static int BLANC = WHITE;
+	public final static int ROUGE = RED;
+}
diff --git a/src/lessons/sort/dutchflag/universe/DutchFlagWorld.html b/src/lessons/sort/dutchflag/universe/DutchFlagWorld.html
new file mode 100644
index 0000000..8b01251
--- /dev/null
+++ b/src/lessons/sort/dutchflag/universe/DutchFlagWorld.html
@@ -0,0 +1,22 @@
+<h1>The Dutch Flag Problem</h1>
+<p>The colors are represented by integers (either 0, 1 or 2). </p>
+
+<h2>Provided functions</h2>
+
+<p>This world is very simple, with only 5 provided functions. </p>
+
+<pre>[!java]void [/!]swap([!java]int [/!]x[!scala]:Int[/!], [!java]int [/!]y[!scala]:Int[/!])</pre>
+Swap the lines number <code>x</code> and <code>y</code>.
+
+<pre>[!java]int [/!]getSize() [!scala]:Int[/!]</pre>
+Returns the amount of lines on this flag.
+
+<pre>[!java]int [/!]getColor([!java]int [/!]line[!scala]:Int[/!])  [!scala]:Int[/!]</pre>
+Returns the color of the given line.
+
+<pre>[!java]boolean [/!]isSorted()  [!scala]:Boolean[/!]</pre>
+Returns whether the flag is sorted.
+     
+<pre>[!java]boolean [/!]isSelected()  [!scala]:Boolean[/!]</pre>
+Returns whether the current world is selected in the interface.
+
diff --git a/src/lessons/sort/dutchflag/universe/DutchFlagWorld.java b/src/lessons/sort/dutchflag/universe/DutchFlagWorld.java
new file mode 100644
index 0000000..a5ac293
--- /dev/null
+++ b/src/lessons/sort/dutchflag/universe/DutchFlagWorld.java
@@ -0,0 +1,247 @@
+package lessons.sort.dutchflag.universe;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptException;
+import javax.swing.ImageIcon;
+
+import plm.core.model.Game;
+import plm.core.model.ProgrammingLanguage;
+import plm.core.ui.ResourcesCache;
+import plm.core.ui.WorldView;
+import plm.universe.EntityControlPanel;
+import plm.universe.World;
+
+public class DutchFlagWorld extends World {
+
+	int[] content;
+	int moveCount = 0;
+	
+	/** Copy constructor */ 
+	public DutchFlagWorld(DutchFlagWorld world) {
+		super(world);
+	}
+	
+	/** Returns a component able of displaying the world */
+	@Override
+	public WorldView getView() {
+		return new DutchFlagWorldView(this);
+	}
+	/** Returns the icon of the universe */
+	@Override
+	public ImageIcon getIcon() {
+		return ResourcesCache.getIcon(this,"world_dutchflag.png");
+	}
+	/** Returns the panel which let the user to interact dynamically with the world */
+	@Override
+	public EntityControlPanel getEntityControlPanel() {
+		return new EntityControlPanel() {
+			
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void setEnabledControl(boolean enabled) {
+				// TODO Auto-generated method stub
+				
+			}
+		};
+	}	
+	
+	private int initialContent[];
+	/** 
+	 * Regular PancakeWorld constructor that creates a random flag
+	 * @param name : the name of the world
+	 * @param size : the amount of elements 
+	 */
+	public DutchFlagWorld(String name, int size) {
+		super(name);
+		setDelay(size>100?20:200); // Delay (in ms) in default animations
+		new DutchFlagEntity(this);
+		
+		content = new int[size];
+		initialContent = new int[size];
+		for (int i=0; i<size; i++) {
+			double r = Math.random();
+			if (r<1./3.)
+				content[i] = 0;
+			else if (r < 2./3.)
+				content[i] = 1;
+			else
+				content[i] = 2;
+			
+			initialContent[i] = content[i];
+		}
+	}
+	
+	public DutchFlagWorld(String name, int size, int colorRemoved) {
+		super(name);
+		setDelay(size>100?20:200); // Delay (in ms) in default animations
+		new DutchFlagEntity(this);
+		int [][]color = {
+				{1,2},
+				{0,2},
+				{0,1}
+		};
+		
+		content = new int[size];
+		initialContent = new int[size];
+		for (int i=0; i<size; i++) {
+			double r = Math.random();
+			if (r<1./2.)
+				content[i] = color[colorRemoved][0];
+			else
+				content[i] = color[colorRemoved][1];
+			
+			initialContent[i] = content[i];
+		}
+	}
+
+	/** Returns a textual description of the differences between the caller and the parameter */
+	@Override
+	public String diffTo(World o) {
+		if (o == null || !(o instanceof DutchFlagWorld))
+			return Game.i18n.tr("This world is not a dutch flag");
+
+		DutchFlagWorld other = (DutchFlagWorld) o;
+		if (content.length != other.content.length)
+			return Game.i18n.tr("The two worlds are of differing size");
+
+		StringBuffer res = new StringBuffer();
+		for ( int i = 0; i<content.length; i++) 
+			if ( content[i] != other.content[i] ) 
+				res.append(Game.i18n.tr(" Ray #{0} differs: color {1} is not color {2}\n",(i+1), content[i],other.content[i]));
+
+		return res.toString();
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (o == null || !(o instanceof DutchFlagWorld))
+			return false;
+		DutchFlagWorld other = (DutchFlagWorld) o;
+		if (content.length != other.content.length)
+			return false;
+		for ( int i = 0; i<content.length; i++) 
+			if ( content[i] != other.content[i] ) 
+				return false;
+		return true;
+	}
+	/** 
+	 * Reset the state of the current world to the one passed in argument
+	 * @param the world which must be the new start of your current world
+	 */
+	@Override
+	public void reset(World world) {
+		DutchFlagWorld other = (DutchFlagWorld) world;
+		this.content = new int[other.content.length];
+		for (int i=0;i<content.length;i++)
+			content[i] = other.content[i];
+
+		this.moveCount = other.moveCount;
+		super.reset(world);		
+	}
+
+	/** Ensures that the provided engine can be used to solve Pancake exercises */ 
+	@Override
+	public void setupBindings(ProgrammingLanguage lang, ScriptEngine e) throws ScriptException {
+		if (lang.equals(Game.PYTHON)) {
+			e.eval(
+				"def getSize():\n" +
+				"  return entity.getSize()\n" +
+				"def getColor(rank):\n" +
+				"  return entity.getColor(rank)\n" +
+				"def swap(i,j):\n" +
+				"  entity.swap(i,j)\n"	+
+				"BLUE = entity.BLUE\n"	+
+				"WHITE = entity.WHITE\n"	+
+				"RED = entity.RED\n"	+
+				/* BINDINGS TRANSLATION: French */
+				"def getTaille():\n"+
+				"  return getSize()\n"+
+				"def getCouleur(rank):\n"+
+				"  return getColor(rank)\n"+
+				"def echange(i,j):\n"+
+				"  return swap(i,j)\n"+
+				"BLEU = entity.BLUE\n"	+
+				"BLANC = entity.WHITE\n"	+
+				"ROUGE = entity.RED\n"	
+				);
+		} else {
+			throw new RuntimeException("No binding of PancakeWorld for "+lang);
+		}
+	}
+
+	/* --------------------------------------- */
+	/** Swap two positions */
+	public void swap(int from, int to) {
+		if ( from < 0 || from >= getSize())
+			throw new IllegalArgumentException(Game.i18n.tr("Cannot swap {0} and {1} because {2} is not between 0 and {3}",
+					from, to, from, getSize()-1));
+		if ( to < 0 || to >= getSize())
+			throw new IllegalArgumentException(Game.i18n.tr("Cannot swap {0} and {1} because {2} is not between 0 and {3}",
+					from, to, to, getSize()-1));
+		
+		int temp = content[from];
+		content[from] = content[to];
+		content[to] = temp;
+		
+		moveCount++;
+	}	
+	
+	/**
+	 * Give the color of of a specific ray in the flag
+	 * @param rank : the number of the ray that you want to get.
+	 * @return The color of that ray (either 0, 1 or 2)
+	 */
+	public int getColor(int rank) {
+		if ( rank < 0 || rank >= getSize())
+			throw new IllegalArgumentException(Game.i18n.tr("Cannot get the color of line #{0} because it''s not between 0 and {1}",rank, getSize()));
+
+		return content[rank];
+	}
+	
+	/** Returns the amount of rays in this flag */
+	public int getSize() {
+		return content.length;
+	}
+	
+	
+	/** Returns whether the flag is correctly sorted */
+	public boolean isSorted() {
+		int currentColor = 0;
+		for ( int rank = 0 ; rank < content.length ; rank++) {
+			if (content[rank] > currentColor)
+				currentColor = content[rank];
+			if (content[rank] < currentColor)
+				return false;
+		}
+		return true;
+	}
+	public void assertSorted() {
+		if (isSorted())
+			return;
+		
+		StringBuffer sb = new StringBuffer("{");
+
+		for (int rank = 0 ; rank < getSize() ; rank++) {
+			if (rank!=0)
+				sb.append(", ");
+			sb.append(content[rank]);
+		}
+		sb.append("}");
+
+		String msg =Game.i18n.tr("It''s still not sorted!! PLEASE REPORT THIS BUG, along with the following information:\n" +
+				"Initial situation: {0}", sb.toString());
+		System.err.println(msg);
+		throw new RuntimeException(msg);
+
+	}
+	
+	/** Returns a string representation of the world */
+	public String toString(){
+		StringBuffer res = new StringBuffer("<DutchFlagWorld name:"+getName()+" size:"+getSize()+">");
+		for (int i=0;i<getSize();i++) 
+			res.append( (i==0?"":", ")+content[i]);
+		res.append("</DutchFlagWorld>");
+		return res.toString();
+	}
+}
\ No newline at end of file
diff --git a/src/lessons/sort/dutchflag/universe/DutchFlagWorldView.java b/src/lessons/sort/dutchflag/universe/DutchFlagWorldView.java
new file mode 100644
index 0000000..abbc87f
--- /dev/null
+++ b/src/lessons/sort/dutchflag/universe/DutchFlagWorldView.java
@@ -0,0 +1,99 @@
+package lessons.sort.dutchflag.universe;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.Shape;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.geom.Rectangle2D;
+
+import plm.core.ui.WorldView;
+import plm.universe.World;
+
+public class DutchFlagWorldView extends WorldView {
+
+	private static final long serialVersionUID = 1L;
+	private double height;
+		
+	public DutchFlagWorldView(World w) {
+		super(w);
+		
+		
+		addMouseListener(new MouseListener() {
+			@Override
+			public void mouseReleased(MouseEvent e) {}
+			@Override
+			public void mousePressed(MouseEvent e) {}
+			@Override
+			public void mouseExited(MouseEvent e) {}
+			@Override
+			public void mouseEntered(MouseEvent e) {}
+			
+			@Override
+			public void mouseClicked(MouseEvent e) {
+//				int rank = (int) (e.getY()/height);
+						
+//				((DutchFlagWorld) world).setSelectedPancake(rank+1);
+//				if (e.getClickCount()==2)
+//					((DutchFlagWorld) world).doMove();
+			}
+		});
+
+	}
+
+	private static final Color dutchRed = new Color(174,28,40);
+	private static final Color dutchBlue = new Color(33,70,139);
+	/**
+	 * Draw the component of the world
+	 * @param g : some Graphics
+	 */
+	public void paintComponent(Graphics g) {
+		super.paintComponent(g);
+		DutchFlagWorld flag = (DutchFlagWorld) world;
+		
+		Graphics2D g2 = (Graphics2D) g;
+
+		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+		g2.setFont(new Font("Monaco", Font.PLAIN, 12));
+
+		/* clear board */
+		g2.setColor(Color.white);
+		g2.fill(new Rectangle2D.Double(0., 0., getWidth(), getHeight()));
+		
+		/* Draw the pancakes */
+		int stackSize = flag.getSize();
+		height = ((double)getHeight()) / stackSize;
+		
+		for (int rank=0;rank< stackSize;rank++) { 
+			Shape rect = new Rectangle2D.Double(0, height*(stackSize-rank-1), getWidth(), height);
+
+			switch (flag.getColor(rank)) {
+			case DutchFlagEntity.BLUE:
+				g2.setColor(dutchBlue);
+				break;
+			case DutchFlagEntity.WHITE:
+				g2.setColor(Color.white);
+				break;
+			case DutchFlagEntity.RED:
+				g2.setColor(dutchRed);
+				break;
+			}
+			g2.fill(rect);
+
+			if (flag.getSize()<100) {
+				g2.setColor(Color.black);
+				g2.draw(rect);
+			}
+			
+		}
+						
+		if (flag.getColor(stackSize-1) == DutchFlagEntity.WHITE)
+			g2.setColor(Color.black);
+		else
+			g2.setColor(Color.yellow);
+		g2.drawString(""+flag.moveCount+" moves", 0, 15);
+	}
+}
diff --git a/src/lessons/sort/dutchflag/universe/world_dutchflag.png b/src/lessons/sort/dutchflag/universe/world_dutchflag.png
new file mode 100644
index 0000000..74243a8
Binary files /dev/null and b/src/lessons/sort/dutchflag/universe/world_dutchflag.png differ
diff --git a/src/lessons/sort/pancake/universe/PancakeWorld.fr.html b/src/lessons/sort/pancake/universe/PancakeWorld.fr.html
index ebe103c..ac43aa8 100644
--- a/src/lessons/sort/pancake/universe/PancakeWorld.fr.html
+++ b/src/lessons/sort/pancake/universe/PancakeWorld.fr.html
@@ -18,7 +18,7 @@ est à l'envers, c'est-à-dire si sa face brulée est en haut.
 Retourne les <code>quantité</code> premières crêpes de la pile, en partant
 du sommet de celle-ci.
 
-<pre>[!java]boolean [/!]estTrie()   [!scala]:Boolean[/!]</pre>
+<pre>[!java]boolean [/!]estTriee()   [!scala]:Boolean[/!]</pre>
 Renvoie si la pile de crêpes est correctement triée.
 
 <pre>[!java]boolean [/!]estSelectionne() [!scala]:Boolean[/!]</pre>
diff --git a/src/lessons/sort/pancake/universe/PancakeWorld.java b/src/lessons/sort/pancake/universe/PancakeWorld.java
index 2724999..b040714 100644
--- a/src/lessons/sort/pancake/universe/PancakeWorld.java
+++ b/src/lessons/sort/pancake/universe/PancakeWorld.java
@@ -113,7 +113,7 @@ public class PancakeWorld extends World {
 	@Override
 	public String diffTo(World o) {
 		if (o == null || !(o instanceof PancakeWorld))
-			return Game.i18n.tr("This is not a world of pancakes :-(");
+			return Game.i18n.tr("This is not a world of pancakes");
 
 		PancakeWorld other = (PancakeWorld) o;
 		if (pancakeStack.length != other.pancakeStack.length)
@@ -122,7 +122,7 @@ public class PancakeWorld extends World {
 		StringBuffer res = new StringBuffer();
 		for ( int i = 0;i< pancakeStack.length;i++) 
 			if ( !pancakeStack[i].equals(other.pancakeStack[i], burnedWorld)) 
-				res.append(" Pancake #"+(i+1)+" differs: "+pancakeStack[i].toString() +" vs "+other.pancakeStack[i].toString()+"\n");
+				res.append(Game.i18n.tr(" Pancake #{0} differs: {1} vs. {2}\n",(i+1),pancakeStack[i].toString(),other.pancakeStack[i].toString()));
 
 		return res.toString();
 	}
@@ -154,6 +154,7 @@ public class PancakeWorld extends World {
 
 		this.burnedWorld = other.burnedWorld;
 		this.lastMove = other.lastMove;
+		this.moveCount = other.moveCount;
 		super.reset(world);		
 	}
 
diff --git a/src/lessons/turtleart/FlowerEntity.java b/src/lessons/turtleart/FlowerEntity.java
new file mode 100644
index 0000000..bc05dcf
--- /dev/null
+++ b/src/lessons/turtleart/FlowerEntity.java
@@ -0,0 +1,39 @@
+package lessons.turtleart;
+
+import plm.universe.turtles.Turtle;
+
+public class FlowerEntity extends Turtle {
+
+	/* BEGIN TEMPLATE */
+	public void run() {
+		/* BEGIN SOLUTION */
+		addSizeHint(80, 175, 80, 125);
+
+		for(int i=0;i<8;i++) {
+			forward(50.0);
+			right(360/8);
+		}
+		forward(25.0);
+		left(360/8);
+		for(int i=0;i<8;i++) {
+			right(360/4);
+			forward(25.0);
+			left(360/8);
+			forward(25.0);
+		}
+		right(360/4);
+		forward(25.0);
+		left(360/4);
+		for(int i=0;i<8;i++) {
+			right(3*360/8);
+			forward(25.0);
+			right(360/8);
+			forward(25.0);
+			backward(25.0);
+			left(3*360/8);
+			forward(25.0);
+		}
+		/* END SOLUTION */
+	}
+	/* END TEMPLATE */
+}
diff --git a/src/lessons/turtleart/FlowerEntity.py b/src/lessons/turtleart/FlowerEntity.py
new file mode 100644
index 0000000..d89d30c
--- /dev/null
+++ b/src/lessons/turtleart/FlowerEntity.py
@@ -0,0 +1,28 @@
+# BEGIN SOLUTION 
+
+addSizeHint(80, 175, 80, 125)
+
+for i in range(8):
+    forward(50.0)
+    right(360/8)
+
+forward(25.0)
+left(360/8)
+for i in range(8):
+    right(360/4)
+    forward(25.0)
+    left(360/8)
+    forward(25.0)
+
+right(360/4)
+forward(25.0)
+left(360/4)
+for i in range(8):
+    right(3*360/8)
+    forward(25.0)
+    right(360/8)
+    forward(25.0)
+    backward(25.0)
+    left(3*360/8)
+    forward(25.0)
+# END SOLUTION 
diff --git a/src/lessons/turtleart/FlowerEntity.scala b/src/lessons/turtleart/FlowerEntity.scala
new file mode 100644
index 0000000..b6bb25f
--- /dev/null
+++ b/src/lessons/turtleart/FlowerEntity.scala
@@ -0,0 +1,40 @@
+package lessons.turtleart;
+
+import plm.universe.turtles.Turtle;
+
+class ScalaFlowerEntity extends Turtle {
+
+	/* BEGIN TEMPLATE */
+	override def run() {
+		/* BEGIN SOLUTION */
+
+		addSizeHint(80, 175, 80, 125)
+
+		for(i <- 1 to 8) {
+			forward(50.0)
+			right(360/8)
+		}
+		forward(25.0)
+		left(360/8)
+		for(i <- 1 to 8) {
+			right(360/4)
+			forward(25.0)
+			left(360/8)
+			forward(25.0)
+		}
+		right(360/4)
+		forward(25.0)
+		left(360/4)
+		for(i <- 1 to 8) {
+			right(3*360/8)
+			forward(25.0)
+			right(360/8)
+			forward(25.0)
+			backward(25.0)
+			left(3*360/8)
+			forward(25.0)
+		}
+		/* END SOLUTION */
+	}
+	/* END TEMPLATE */
+}
diff --git a/src/lessons/turtleart/Main.java b/src/lessons/turtleart/Main.java
index 6c4e858..9946ddf 100644
--- a/src/lessons/turtleart/Main.java
+++ b/src/lessons/turtleart/Main.java
@@ -45,6 +45,7 @@ public class Main extends Lesson {
 		addExercise(new TurtleGraphicalExercise(this,"DiskFour",     300,300, 150,150));
 		addExercise(new TurtleGraphicalExercise(this,"DiskTwo",      300,300, 150,150));
 		addExercise(new TurtleGraphicalExercise(this,"Star",         300,300, 150,200));
+		addExercise(new TurtleGraphicalExercise(this,"Flower",       300,300, 90, 175));
 		
 		setCurrentExercise(currentExercise); // recompute the missions
 	}
@@ -80,6 +81,7 @@ class TurtleGraphicalExercise extends ExerciseTemplated{
 	@Override
 	public void loadHTMLMission() {
 		StringBuffer res = new StringBuffer();
+		int exoCount = 0;
 		for (Lecture l : getLesson().exercises()) {
 			int iconSize=100;
 			Exercise exo = (Exercise) l;
@@ -129,6 +131,9 @@ class TurtleGraphicalExercise extends ExerciseTemplated{
 			res.append("<img src=\"");
 			res.append(path);
 			res.append("\"></a> ");
+			exoCount++;
+			if (exoCount % 5 == 0)
+				res.append("<br> ");
 		}
 		setMission(res.toString());
 	}
diff --git a/src/lessons/turtleart/StarEntity.java b/src/lessons/turtleart/StarEntity.java
index fde00bc..691b621 100644
--- a/src/lessons/turtleart/StarEntity.java
+++ b/src/lessons/turtleart/StarEntity.java
@@ -7,6 +7,7 @@ public class StarEntity extends Turtle {
 	/* BEGIN TEMPLATE */
 	public void run() {
 		/* BEGIN SOLUTION */
+		addSizeHint(165, 200, 165, 150);
 		for (int i = 0; i < BRANCH_COUNT; i++) 
 			branch(50);
 		
diff --git a/src/lessons/turtleart/StarEntity.py b/src/lessons/turtleart/StarEntity.py
index 7436207..0163ce0 100644
--- a/src/lessons/turtleart/StarEntity.py
+++ b/src/lessons/turtleart/StarEntity.py
@@ -7,6 +7,7 @@ def branch(size):
   for i in range(2):
     left(360 / BRANCH_COUNT);
 
+addSizeHint(165, 200, 165, 150)
 BRANCH_COUNT = 5;
 for i in range(BRANCH_COUNT):
    branch(50);
diff --git a/src/lessons/turtleart/StarEntity.scala b/src/lessons/turtleart/StarEntity.scala
index 49be8b0..d9a4012 100644
--- a/src/lessons/turtleart/StarEntity.scala
+++ b/src/lessons/turtleart/StarEntity.scala
@@ -7,6 +7,8 @@ class ScalaStarEntity extends Turtle {
 	/* BEGIN TEMPLATE */
 	override def run() {
 		/* BEGIN SOLUTION */
+		addSizeHint(165, 200, 165, 150)
+
 		for (i <- 1 to BRANCH_COUNT) 
 			branch(50);
 		
diff --git a/src/lessons/welcome/array/basics/Array2Entity.py b/src/lessons/welcome/array/basics/Array2Entity.py
index 00f839c..e92228f 100644
--- a/src/lessons/welcome/array/basics/Array2Entity.py
+++ b/src/lessons/welcome/array/basics/Array2Entity.py
@@ -1,6 +1,5 @@
 def setX(i):
 	errorMsg("Sorry Dave, I cannot let you use setX(x) in this exercise. Walk to your goal instead.")
-
 def setY(i):
 	errorMsg("Sorry Dave, I cannot let you use setY(y) in this exercise. Walk to your goal instead.")
 def setPos(x,y):
diff --git a/src/lessons/welcome/array/has271/Has271.fr.html b/src/lessons/welcome/array/has271/Has271.fr.html
index a0ad9e8..c51329e 100644
--- a/src/lessons/welcome/array/has271/Has271.fr.html
+++ b/src/lessons/welcome/array/has271/Has271.fr.html
@@ -2,8 +2,7 @@
 <p>Soit un tableau d'entiers, renvoyez vrai si il contient un motif 2,7,1 --
 une valeur, suivie de cette valeur plus 5, suivie par cette valeur moins 1.
 Par exemple, 2,7,1 est un tel motif car 7=5+2 et 1=2-1. 3,8,2 est un autre
-motif correspondant.
-</p>
+motif correspondant.</p>
  
 <p>De plus, le 271 compte même si le "1" diffère de 2 ou moins de la valeur
 correcte.<</p>
diff --git a/src/lessons/welcome/variables/Variables.fr.html b/src/lessons/welcome/variables/Variables.fr.html
index b68dab6..03375e5 100644
--- a/src/lessons/welcome/variables/Variables.fr.html
+++ b/src/lessons/welcome/variables/Variables.fr.html
@@ -66,9 +66,7 @@ var y = 10       <span class="comment">// ou bien je peux l'omettre</span></pre>
 [!thelang]. Cela veut dire qu'elles sont en quelque sorte spécialisées: une
 variable donnée ne peut stocker qu'un type de données spécifique. N'essayez
 même pas de ranger des nombres dans une variable faite pour recevoir des
-lettres !
-On dit que [!thelang] est un langage <b>typé statiquement</b>.
-</p>
+lettres ! On dit que [!thelang] est un langage <b>typé statiquement</b>.</p>
 <p>D'autres langages (comme le python) sont moins regardants, et on peut ranger
 n'importe quel type de données dans n'importe quelle variable sans
 restriction. À première vue, cela semble plus simple, mais ce genre de
@@ -90,8 +88,7 @@ Python, ce qui veut dire qu'elles ne sont pas spécialisées sur un type de
 données particulier. Il est tout à fait envisageable de stocker des nombres
 dans une variable, puis d'y mettre des lettres un peu plus tard. Les valeurs
 elles-mêmes ont bien entendu un type, mais pas les variables. On dit alors
-que python est un langage <b>dynamiquement typé</b>.
-</p>
+que python est un langage <b>dynamiquement typé</b>.</p>
 <p>D'autres langages (comme le Java ou le Scala) sont plus restrictifs et
 imposent de spécialiser chaque variable pour un type donné (on dit que ce
 sont des langages <b>statiquement typés</b>). Cela semble bien plus
diff --git a/src/plm/core/ExoTest.java b/src/plm/core/ExoTest.java
index 63de7d3..09d8fcf 100644
--- a/src/plm/core/ExoTest.java
+++ b/src/plm/core/ExoTest.java
@@ -33,7 +33,7 @@ import plm.universe.bat.BatWorld;
 public class ExoTest {
 	static private String[] lessons = new String[] { 
 		"lessons.welcome", "lessons.turmites", "lessons.maze", "lessons.turtleart",
-		"lessons.sort", "lessons.sort.baseball", "lessons.sort.pancake",  
+		"lessons.sort.basic", "lessons.sort.dutchflag", "lessons.sort.baseball", "lessons.sort.pancake",  
 		"lessons.recursion", "lessons.recursion.hanoi",
 		// "lessons.lightbot", // Well, testing this requires testing the swing directly I guess
 		"lessons.bat.string1",
diff --git a/src/plm/core/model/session/FileSessionKit.java b/src/plm/core/model/session/FileSessionKit.java
deleted file mode 100644
index 0a4c849..0000000
--- a/src/plm/core/model/session/FileSessionKit.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package plm.core.model.session;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-
-import plm.core.model.Game;
-import plm.core.model.Logger;
-import plm.core.model.ProgrammingLanguage;
-import plm.core.model.lesson.Exercise;
-import plm.core.model.lesson.Lecture;
-import plm.core.model.lesson.Lesson;
-
-/**
- * Implementation of the {@link ISessionKit} saving the student data as a collection of 
- * separated files. It is not used by default, and you have to edit the source to activate it.
- *
- */
-public class FileSessionKit /* FIXME implements ISessionKit  */ {
-
-	private Game game;
-
-	private static String HOME_DIR = System.getProperty("user.home");
-	private static String SEP = System.getProperty("file.separator");
-	private static File SAVE_DIR = new File(HOME_DIR + SEP + ".plm");
-
-	public FileSessionKit(Game game) {
-		this.game = game;
-	}
-
-	public void storeAll() {
-		if (!SAVE_DIR.exists())
-			if (! SAVE_DIR.mkdir()) {
-				Logger.log("FileSessionKit:store", "cannot create session store directory");
-			};
-
-			// File lessonDir;
-			File exerciseDir;
-			for (Lesson lesson : this.game.getLessons()) {
-
-				for (Lecture lecture : lesson.exercises()) {
-					if (lecture instanceof Exercise) {
-						Exercise exercise = (Exercise) lecture;
-						exerciseDir = new File(SAVE_DIR, exercise.getId());
-						if (!exerciseDir.exists())
-							if (! exerciseDir.mkdir()) 
-								Logger.log("FileSessionKit:store", "cannot remove "+exerciseDir+" directory");
-
-
-						// create file DONE if exercise has been successfully passed
-						for (ProgrammingLanguage lang: exercise.getProgLanguages()) {
-							File exerciseFile = new File(exerciseDir, "DONE."+lang.getExt());
-							if (Game.getInstance().studentWork.getPassed(exercise, lang)) {
-								if (!exerciseFile.exists()) {
-									try {
-										exerciseFile.createNewFile();
-									} catch (IOException e) {
-										e.printStackTrace();
-									}
-								}
-							} else {
-								if (exerciseFile.exists()) {
-									if (!exerciseFile.delete()) {
-										Logger.log("FileSessionKit:store", "cannot remove "+exerciseFile+" directory");
-									}
-								}
-							}
-						}
-
-						// save exercise body
-						for (ProgrammingLanguage lang:exercise.getProgLanguages()) 
-							for (int i = 0; i < exercise.getSourceFileCount(lang); i++) {
-								SourceFile sf = exercise.getSourceFile(lang,i);
-
-								if (!(sf instanceof SourceFileRevertable))
-									continue;
-
-								SourceFileRevertable srcFile = (SourceFileRevertable)sf;
-								File outputFile = new File(exerciseDir+"/"+lang, srcFile.getName());
-
-								if (srcFile.hasChanged()) {
-									BufferedWriter bw = null;
-									try {
-										bw = new BufferedWriter(new FileWriter(outputFile));
-										bw.write(srcFile.getBody());
-									} catch (IOException e) {
-										e.printStackTrace();
-									} finally {
-										try {
-											bw.close();
-										} catch (IOException e) {
-											e.printStackTrace();
-										}
-									}
-								} else {
-									if (outputFile.exists())
-										if (! outputFile.delete())
-											Logger.log("FileSessionKit:store", "cannot remove "+outputFile);
-								}
-							}
-					} // is exercise
-				} // end-for lecture
-			} // end-for lesson
-	}
-
-	public void loadAll() {
-		if (!SAVE_DIR.exists())
-			return;
-
-		// File lessonDir;
-		File exerciseDir;
-		for (Lesson lesson : this.game.getLessons()) {
-			for (Lecture lecture : lesson.exercises()) {
-				if (lecture instanceof Exercise) {
-					Exercise exercise = (Exercise) lecture;
-					exerciseDir = new File(SAVE_DIR, exercise.getId());
-					if (!exerciseDir.exists())
-						continue;
-
-
-					// load exercise body
-					for (ProgrammingLanguage lang:exercise.getProgLanguages()) {
-						File exerciseFile = new File(exerciseDir, "DONE"+lang.getExt());
-						if (exerciseFile.exists()) {
-							Game.getInstance().studentWork.setPassed(lecture, lang, true);
-						}
-						
-						for (int i = 0; i < exercise.getSourceFileCount(lang); i++) {
-							SourceFile srcFile = exercise.getSourceFile(lang,i);
-
-							File of = new File(exerciseDir+"/"+lang, srcFile.getName());
-							if (!of.exists()) /* try to load using the old format (not specifying the programming language) */
-								of = new File(exerciseDir+"/"+lang, srcFile.getName());
-							if (of.exists()) {
-								BufferedReader br = null;
-								try {
-									br = new BufferedReader(new FileReader(of));
-									String s;
-									StringBuffer b = new StringBuffer();
-
-									while ((s = br.readLine()) != null) {
-										b.append(s);
-										b.append("\n");
-									}
-
-									srcFile.setBody(b.toString());
-								} catch (IOException e) {
-									e.printStackTrace();
-								} finally {
-									try {
-										br.close();
-									} catch (IOException e) {
-										e.printStackTrace();
-									}
-								}
-							}
-						}
-					}
-				} // is exercise
-			} // end-for lecture
-		} // end-for lesson
-	}
-
-	public void cleanUp() {
-		if (!SAVE_DIR.exists())
-			return;
-
-		File exerciseDir;
-		for (Lesson lesson : this.game.getLessons()) {
-			for (Lecture lecture : lesson.exercises()) {
-				if (lecture instanceof Exercise) {
-					Exercise exercise = (Exercise) lecture;
-					exerciseDir = new File(SAVE_DIR, exercise.getId());
-					if (!exerciseDir.exists())
-						continue;
-
-					File exerciseFile = new File(exerciseDir, "DONE");
-					if (exerciseFile.exists()) {
-						if (!exerciseFile.delete()) {
-							Logger.log("FileSessionKit:cleanUp", "cannot remove "+exerciseFile);
-						};
-					}
-
-					for (ProgrammingLanguage lang:exercise.getProgLanguages()) 
-						for (int i = 0; i < exercise.getSourceFileCount(lang); i++) {
-							SourceFile srcFile = exercise.getSourceFile(lang, i);
-
-							File of = new File(exerciseDir, srcFile.getName());
-							if (of.exists()) {
-								if (! of.delete()) {
-									Logger.log("FileSessionKit:cleanUp", "cannot remove "+exerciseDir+"/"+srcFile.getName()+" directory");				
-								}
-							}
-						}
-
-					if (! exerciseDir.delete()) {
-						Logger.log("FileSessionKit:cleanUp", "cannot remove "+exerciseDir+" directory");					
-					}
-				} // is exercise
-			} // end-for lectures
-		} // end-for lesson
-		if (! SAVE_DIR.delete()) {
-			Logger.log("FileSessionKit:cleanup", "cannot remove session store directory");
-		}
-	}
-}
diff --git a/src/plm/core/ui/AboutWorldDialog.java b/src/plm/core/ui/AboutWorldDialog.java
index 727aa93..15dcadb 100644
--- a/src/plm/core/ui/AboutWorldDialog.java
+++ b/src/plm/core/ui/AboutWorldDialog.java
@@ -1,35 +1,34 @@
 package plm.core.ui;
 
-import javax.swing.JFrame;
+import java.util.Locale;
 
-import org.xnap.commons.i18n.I18n;
-import org.xnap.commons.i18n.I18nFactory;
+import javax.swing.JFrame;
 
+import plm.core.HumanLangChangesListener;
 import plm.core.ProgLangChangesListener;
 import plm.core.model.Game;
 import plm.core.model.ProgrammingLanguage;
 import plm.core.model.lesson.Exercise;
-import plm.core.model.lesson.Lecture;
 import plm.core.model.lesson.Exercise.WorldKind;
+import plm.core.model.lesson.Lecture;
 
 
-public class AboutWorldDialog extends AbstractAboutDialog implements ProgLangChangesListener {
+public class AboutWorldDialog extends AbstractAboutDialog implements ProgLangChangesListener, HumanLangChangesListener {
 
 	private static final long serialVersionUID = 1766486738385426108L;
 
-	public I18n i18n = I18nFactory.getI18n(getClass(),"org.plm.i18n.Messages",getLocale(), I18nFactory.FALLBACK);
-
 	public AboutWorldDialog(JFrame parent) {
 		super(parent);
 		currentExerciseHasChanged(Game.getInstance().getCurrentLesson().getCurrentExercise());
 		Game.getInstance().addProgLangListener(this);
+		Game.getInstance().addHumanLangListener(this);
 	}
 
 	@Override
 	public void currentExerciseHasChanged(Lecture lecture) {
 		if (lecture instanceof Exercise) {
 			Exercise exo = (Exercise) lecture;
-			setTitle(i18n.tr("About world - {0}",
+			setTitle(Game.i18n.tr("About world - {0}",
 					exo.getWorlds(WorldKind.CURRENT).get(0).getClass().getSimpleName()));
 			area.setText(exo.getWorlds(WorldKind.CURRENT).get(0).getAbout());
 			area.setCaretPosition(0);
@@ -45,4 +44,10 @@ public class AboutWorldDialog extends AbstractAboutDialog implements ProgLangCha
 		area.setText(((Exercise) Game.getInstance().getCurrentLesson().getCurrentExercise()).getWorlds(WorldKind.CURRENT).get(0).getAbout());
 		area.setCaretPosition(pos);
 	}
+
+	@Override
+	public void currentHumanLanguageHasChanged(Locale newLang) {
+		setTitle(Game.i18n.tr("About world - {0}",
+				((Exercise) Game.getInstance().getCurrentLesson().getCurrentExercise()).getWorlds(WorldKind.CURRENT).get(0).getClass().getSimpleName()));
+	}
 }
diff --git a/src/plm/core/ui/ChooseLectureDialog.java b/src/plm/core/ui/ChooseLectureDialog.java
index 63651aa..2a71a19 100644
--- a/src/plm/core/ui/ChooseLectureDialog.java
+++ b/src/plm/core/ui/ChooseLectureDialog.java
@@ -69,7 +69,7 @@ public class ChooseLectureDialog implements TreeSelectionListener {
 
 		JPanel p = new JPanel();
 		p.add(jsp);
-		int result = JOptionPane.showConfirmDialog(null, p, "Choose your next exercise",
+		int result = JOptionPane.showConfirmDialog(MainFrame.getInstance(), p, Game.i18n.tr("Choose your next exercise"),
 				JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
 		if (result == JOptionPane.OK_OPTION) {
 			DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
diff --git a/src/plm/core/ui/ChooseLessonDialog.java b/src/plm/core/ui/ChooseLessonDialog.java
index ea425bc..8fa02f0 100644
--- a/src/plm/core/ui/ChooseLessonDialog.java
+++ b/src/plm/core/ui/ChooseLessonDialog.java
@@ -65,7 +65,7 @@ public class ChooseLessonDialog extends JFrame {
 		
 		LessonMatrix matrix = new LessonMatrix(overview, new String[][] { // WARNING, keep ExoTest.lessons synchronized
 				{"lessons/welcome", "lessons/maze", "lessons/turmites", "lessons/turtleart"},
-				{"lessons/sort", "lessons/sort/baseball", "lessons/sort/pancake"},
+				{"lessons/sort/basic", "lessons/sort/dutchflag", "lessons/sort/baseball", "lessons/sort/pancake"},
 				{"lessons/recursion", "lessons/recursion/hanoi" },
 				{"lessons/lightbot", "lessons/bat/string1" },
 		    }); 
diff --git a/src/plm/core/ui/MainFrame.java b/src/plm/core/ui/MainFrame.java
index 71330ec..a25dcb6 100644
--- a/src/plm/core/ui/MainFrame.java
+++ b/src/plm/core/ui/MainFrame.java
@@ -85,6 +85,9 @@ public class MainFrame extends JFrame implements GameStateListener, GameListener
         
 	private LoggerPanel outputArea;
 	private MissionEditorTabs met;
+	
+	StatusBar statusBar;
+	
 	public I18n i18n = I18nFactory.getI18n(getClass(),"org.plm.i18n.Messages",getLocale(), I18nFactory.FALLBACK);
 
 	private JSplitPane mainPanel;
@@ -426,6 +429,8 @@ public class MainFrame extends JFrame implements GameStateListener, GameListener
 
         helpMeButton = new PropagatingToggleButton(new HelpMe(g, i18n.tr("Call for Help"),
                 ResourcesCache.getIcon("img/btn-alert-off.png")));
+        if (Game.getProperty(Game.PROP_PROGRESS_APPENGINE,"false",true).equals("false")) // Turned off
+        	helpMeButton.setEnabled(false);
 
 		toolBar.add(startButton);
 		toolBar.add(debugButton);
@@ -443,7 +448,7 @@ public class MainFrame extends JFrame implements GameStateListener, GameListener
 	}
 
 	private void initStatusBar(Game g) {
-		StatusBar statusBar = new StatusBar(g);
+		statusBar = new StatusBar(g);
 		getContentPane().add(statusBar, BorderLayout.SOUTH);
 	}
 
diff --git a/src/plm/core/ui/StatusBar.java b/src/plm/core/ui/StatusBar.java
index 6696fa9..23a6dd7 100644
--- a/src/plm/core/ui/StatusBar.java
+++ b/src/plm/core/ui/StatusBar.java
@@ -1,5 +1,6 @@
 package plm.core.ui;
 
+import java.awt.Color;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
@@ -44,6 +45,8 @@ public class StatusBar extends JPanel implements GameListener,GameStateListener,
 
 	public I18n i18n = I18nFactory.getI18n(getClass(),"org.plm.i18n.Messages",getLocale(), I18nFactory.FALLBACK);
 
+	private Color defaultColor, highlightColor = new Color(255,120,120);
+	
 	public StatusBar(Game game) {
 		super();
 		this.game = game;
@@ -52,6 +55,7 @@ public class StatusBar extends JPanel implements GameListener,GameStateListener,
 		game.addProgLangListener(this);
 		game.addGameListener(this);
 		initComponents();
+		defaultColor = getBackground();
 	}
 	
 	public void initComponents() {
@@ -112,10 +116,12 @@ public class StatusBar extends JPanel implements GameListener,GameStateListener,
 		case SAVING:
 			statusMessageLabel.setText(i18n.tr("Saving"));
 			busyIconTimer.start();
+			setBackground(highlightColor);
 			break;
 		case COMPILATION_STARTED:
 			statusMessageLabel.setText(i18n.tr("Compiling"));
 			busyIconTimer.start();
+			setBackground(highlightColor);
 			break;
 		case LOADING_DONE:
 		case SAVING_DONE:
@@ -125,23 +131,28 @@ public class StatusBar extends JPanel implements GameListener,GameStateListener,
 			game.statusRootSet("");
 			game.statusArgEmpty();
 			busyIconTimer.stop();
+			setBackground(defaultColor);
 			statusAnimationLabel.setIcon(ResourcesCache.getIcon("img/busyicon/idle.png"));
 			break;
 		case EXECUTION_STARTED:
 			game.statusRootSet(i18n.tr("Running "));
 			busyIconTimer.start();
+			setBackground(highlightColor);
 			break;
 		case DEMO_STARTED:
 			game.statusRootSet(i18n.tr("Playing demo "));
 			busyIconTimer.start();
+			setBackground(highlightColor);
 			break;		
 		case LOADING:
 			game.statusRootSet(i18n.tr("Loading "));
 			busyIconTimer.start();
+			setBackground(highlightColor);
 			break;
 		default:
 			statusMessageLabel.setText("");
 			statusAnimationLabel.setIcon(ResourcesCache.getIcon("img/busyicon/idle.png"));
+			setBackground(defaultColor);
 		}
 	}
 
diff --git a/src/plm/core/ui/action/ExportCloudSession.java b/src/plm/core/ui/action/ExportCloudSession.java
index 1191986..2e4a124 100644
--- a/src/plm/core/ui/action/ExportCloudSession.java
+++ b/src/plm/core/ui/action/ExportCloudSession.java
@@ -127,6 +127,7 @@ public class ExportCloudSession extends AbstractGameAction {
 					JOptionPane.INFORMATION_MESSAGE
 					);			
 		} catch (Exception ex) {
+			//TODO: ex.printStackTrace() should be log in debug mode
 			JOptionPane.showMessageDialog(this.parent,
 					Game.i18n.tr("<html>Export to cloud failed.<br/>{0}<br/>Caution! Your session is not saved yet.</html>",ex.getMessage()),
 				    Game.i18n.tr("Export error"),
diff --git a/src/plm/core/ui/action/ImportCloudSession.java b/src/plm/core/ui/action/ImportCloudSession.java
index 69ce0c8..905b331 100644
--- a/src/plm/core/ui/action/ImportCloudSession.java
+++ b/src/plm/core/ui/action/ImportCloudSession.java
@@ -39,7 +39,7 @@ public class ImportCloudSession extends AbstractGameAction {
 		this.parent = parent;
 	}
 
-	private void downloadSessionPackage(String fileID, File destFile) throws IOException {
+	private void downloadSessionPackage(String fileID, File destFile) throws Exception {
 		HttpClient client = null;
 
 		try {
@@ -80,6 +80,8 @@ public class ImportCloudSession extends AbstractGameAction {
 							get.abort();
 					}
 				}
+			} else {
+				throw new Exception(i18n.tr("Download failed - Please check the code you entered."));
 			}
 		} finally {
 			if (client != null)
@@ -141,18 +143,22 @@ public class ImportCloudSession extends AbstractGameAction {
 			tmpFile = FileUtils.createTemporaryFilename();
 
 			downloadSessionPackage(fileID, tmpFile);
-			unzipSessionPackage(tmpFile, tmpDir);
+			if (! tmpFile.exists()) {
+				unzipSessionPackage(tmpFile, tmpDir);
 
-			ZipSessionKit kit = new ZipSessionKit(this.game);
-			kit.loadAll(tmpDir);
+				ZipSessionKit kit = new ZipSessionKit(this.game);
+				kit.loadAll(tmpDir);
 
-			JOptionPane.showMessageDialog(this.parent,
+				JOptionPane.showMessageDialog(this.parent,
 					i18n.tr("Your session has been successfully imported."),
 					i18n.tr("Importation suceeded"), JOptionPane.INFORMATION_MESSAGE);
+			} else {
+				throw new Exception(i18n.tr("Something unexpected went wrong during downloading"));
+			}
 
-		} catch (IOException ex) {
+		} catch (Exception ex) {
 			JOptionPane.showMessageDialog(this.parent,
-					i18n.tr("A {0} exception occured while importing your session: {1}"+ex.getClass().getName(),ex.getLocalizedMessage()), 
+					i18n.tr("A {0} exception occured while importing your session: {1}",ex.getClass().getName(),ex.getLocalizedMessage()), 
 					i18n.tr("Importation error"),
 					JOptionPane.ERROR_MESSAGE);
 			// TODO: we should log the real exception message in order to be
diff --git a/src/plm/core/ui/editor/buggleeditor/PropertiesEditor.java b/src/plm/core/ui/editor/buggleeditor/PropertiesEditor.java
index ee729ba..ddb1e24 100644
--- a/src/plm/core/ui/editor/buggleeditor/PropertiesEditor.java
+++ b/src/plm/core/ui/editor/buggleeditor/PropertiesEditor.java
@@ -298,15 +298,15 @@ public class PropertiesEditor extends JComponent implements EditionListener {
 			model.addRow(new Object[] {i18n.tr("Buggle color (name or r/g/b)"), new PLMProperty(properties) {
 				@Override
 				public String toString() {
-					return ColorMapper.color2name( selectedBuggle.getColor() );
+					return ColorMapper.color2name( selectedBuggle.getBodyColor() );
 				}
 				@Override
 				public void setValue(String value) {
 					try {
 						Color c = ColorMapper.name2color(value);
-						selectedBuggle.setColor(c);
+						selectedBuggle.setBodyColor(c);
 					} catch (InvalidColorNameException icn) {
-						table.setValueAt(ColorMapper.color2name(selectedBuggle.getColor()),rank,1);
+						table.setValueAt(ColorMapper.color2name(selectedBuggle.getBodyColor()),rank,1);
 					}
 				}
 			}});
diff --git a/src/plm/universe/bugglequest/AbstractBuggle.java b/src/plm/universe/bugglequest/AbstractBuggle.java
index 1dcdd10..07dc37f 100644
--- a/src/plm/universe/bugglequest/AbstractBuggle.java
+++ b/src/plm/universe/bugglequest/AbstractBuggle.java
@@ -18,7 +18,7 @@ public abstract class AbstractBuggle extends Entity {
 	int k_val = 0;
 	int[] k_seq = {0,0, 1,1, 2,3, 2,3, 4,5};
 	
-	Color color;
+	Color bodyColor;
 	
 	Color brushColor;
 
@@ -66,7 +66,7 @@ public abstract class AbstractBuggle extends Entity {
 
 	public AbstractBuggle(World world, String name, int x, int y, Direction direction, Color color, Color brushColor) {
 		super(name,world);
-		this.color = color;
+		this.bodyColor = color;
 		this.brushColor = brushColor;
 		this.x = x;
 		this.y = y;
@@ -76,7 +76,7 @@ public abstract class AbstractBuggle extends Entity {
 	public void copy(Entity e) {
 		super.copy(e);
 		AbstractBuggle other = (AbstractBuggle)e;
-		this.color = other.color;
+		this.bodyColor = other.bodyColor;
 		this.brushColor = other.brushColor;
 		this.x = other.x;
 		this.y = other.y;
@@ -118,13 +118,13 @@ public abstract class AbstractBuggle extends Entity {
 			brushDown();
 	}
 
-	public Color getColor() {
-		return color;
+	public Color getBodyColor() {
+		return bodyColor;
 	}
 
-	public void setColor(Color c) {
+	public void setBodyColor(Color c) {
 		if (c != null) {
-			this.color = c;
+			this.bodyColor = c;
 			world.notifyWorldUpdatesListeners();
 		}
 	}
@@ -379,7 +379,7 @@ public abstract class AbstractBuggle extends Entity {
 	@Override
 	public String toString() {
 		return "Buggle (" + this.getClass().getName() + "): x=" + x + " y=" + y + " Direction:" + direction + " Color:"
-		+ color;
+		+ bodyColor;
 	}
 
 	@Override
@@ -388,7 +388,7 @@ public abstract class AbstractBuggle extends Entity {
 		int result = 1;
 		result = PRIME * result + ((brushColor == null) ? 0 : brushColor.hashCode());
 		result = PRIME * result + (brushDown ? 1231 : 1237);
-		result = PRIME * result + ((color == null) ? 0 : color.hashCode());
+		result = PRIME * result + ((bodyColor == null) ? 0 : bodyColor.hashCode());
 		result = PRIME * result + ((direction == null) ? 0 : direction.hashCode());
 		result = PRIME * result + x;
 		result = PRIME * result + y;
@@ -405,10 +405,10 @@ public abstract class AbstractBuggle extends Entity {
 			return false;
 		
 		final AbstractBuggle other = (AbstractBuggle) obj;
-		if (color == null) {
-			if (other.color != null)
+		if (bodyColor == null) {
+			if (other.bodyColor != null)
 				return false;
-		} else if (!color.equals(other.color))
+		} else if (!bodyColor.equals(other.bodyColor))
 			return false;
 		if (direction == null) {
 			if (other.direction != null)
@@ -435,8 +435,8 @@ public abstract class AbstractBuggle extends Entity {
 			sb.append(Game.i18n.tr("    Its position is ({0},{1}); expected: ({2},{3}).\n",other.getX(),other.getY(),getX(),getY()));
 		if (getDirection() != other.getDirection()) 
 			sb.append(Game.i18n.tr("    Its direction is {0}; expected: {1}.\n",other.getDirection(),getDirection()));
-		if (getColor() != other.getColor()) 
-			sb.append(Game.i18n.tr("    Its color is {0}; expected: {1}.\n",other.getColor(),getColor()));
+		if (getBodyColor() != other.getBodyColor()) 
+			sb.append(Game.i18n.tr("    Its color is {0}; expected: {1}.\n",other.getBodyColor(),getBodyColor()));
 		if (getBrushColor() != other.getBrushColor())
 			sb.append(Game.i18n.tr("    The color of its brush is {0}; expected: {1}.\n",other.getBrushColor(),getBrushColor()));
 		if (isCarryingBaggle() && !other.isCarryingBaggle())
@@ -458,8 +458,8 @@ public abstract class AbstractBuggle extends Entity {
 	public void avance(int steps) throws BuggleWallException { forward(steps); }
 	public void recule()          throws BuggleWallException { backward(); }
 	public void recule(int steps) throws BuggleWallException { backward(steps); }
-	public Color getCouleur()             { return getColor(); }
-	public void setCouleur(Color c)       { setColor(c); }
+	public Color getCouleurCorps()        { return getBodyColor(); }
+	public void setCouleurCorps(Color c)  { setBodyColor(c); }
 	public boolean estFaceMur()           { return isFacingWall(); }
 	public boolean estDosMur()            { return isBackingWall(); }
 	public void leveBrosse()              { brushUp(); }
diff --git a/src/plm/universe/bugglequest/Buggle.java b/src/plm/universe/bugglequest/Buggle.java
index 29f0632..76debd0 100644
--- a/src/plm/universe/bugglequest/Buggle.java
+++ b/src/plm/universe/bugglequest/Buggle.java
@@ -11,7 +11,7 @@ public final class Buggle extends AbstractBuggle {
 		super();
 		setWorld(b.getWorld());
 		setName(b.getName());
-		setColor(b.color);
+		setBodyColor(b.bodyColor);
 		setBrushColor(b.brushColor);
 		setPosFromLesson(b.getX(), b.getY());
 		setDirection(b.direction);
diff --git a/src/plm/universe/bugglequest/BuggleWorld.fr.html b/src/plm/universe/bugglequest/BuggleWorld.fr.html
index 86d1d00..d461edd 100644
--- a/src/plm/universe/bugglequest/BuggleWorld.fr.html
+++ b/src/plm/universe/bugglequest/BuggleWorld.fr.html
@@ -24,9 +24,9 @@ objets, colorier le sol, se cogner à des murs, etc.
 [/!]y[!scala]:Int[/!])</td></tr>
 
 <tr><td colspan=2 align=center><b>Informations sur la buggle</b></td></tr>
-  <tr><td><b>Obtenir la couleur<br/>Changer la couleur</b></td>
-      <td>[!java]Color [/!]getCouleur()[!scala]:Color[/!]<br/>
-          [!java]void [/!]setCouleur([!java]Color [/!]c[!scala]:Color[/!])</td></tr>				
+  <tr><td><b>Obtenir la couleur de la buggle</b><br/>Changer la couleur de la buggle</b></td>
+      <td>[!java]Color [/!]getCouleurCorps()[!scala]:Color[/!]<br/>
+          [!java]void [/!]setCouleurCorps([!java]Color [/!]c[!scala]:Color[/!])</td></tr>				
   <tr><td><b>Chercher un mur devant<br/>Chercher un mur derriere</b></td>
       <td>[!java]boolean [/!]estFaceMur()[!scala]:Boolean[/!]<br/>
           [!java]boolean [/!]estDosMur()[!scala]:Boolean[/!]</td></tr>				
@@ -66,6 +66,24 @@ Direction.OUEST (l'ouest)</td></tr>
           [!java]void [/!]effaceMessage()</td></tr>
 </table>
 
+<h2>Couleurs valides</h2>
+<table border=1>
+<tr><td>Nom</td><td>Couleur</td></tr>
+<tr><td>Color.black</td>    <td BGCOLOR="#000000"> </td></tr>
+<tr><td>Color.blue</td>     <td BGCOLOR="#0000FF"> </td></tr>
+<tr><td>Color.cyan</td>     <td BGCOLOR="#00FFFF"> </td></tr>
+<tr><td>Color.darkGray</td> <td BGCOLOR="#404040"> </td></tr>
+<tr><td>Color.gray</td>     <td BGCOLOR="#808080"> </td></tr>
+<tr><td>Color.green</td>    <td BGCOLOR="#00FF00"> </td></tr>
+<tr><td>Color.lightGray</td><td BGCOLOR="#C0C0C0"> </td></tr>
+<tr><td>Color.magenta</td>  <td BGCOLOR="#FF00FF"> </td></tr>
+<tr><td>Color.orange</td>   <td BGCOLOR="#FFC800"> </td></tr>
+<tr><td>Color.pink</td>     <td BGCOLOR="#FFAFAF"> </td></tr>
+<tr><td>Color.red</td>      <td BGCOLOR="#FF0000"> </td></tr>
+<tr><td>Color.white</td>    <td BGCOLOR="#FFFFFF"> </td></tr>
+<tr><td>Color.yellow</td>   <td BGCOLOR="#FFFF00"> </td></tr>
+</table>
+
 <h2>Note sur les exceptions</h2>
 Les buggles normales lèvent une exception BuggleWallException si on cherche
 à leur faire traverser un mur.
diff --git a/src/plm/universe/bugglequest/BuggleWorld.html b/src/plm/universe/bugglequest/BuggleWorld.html
index a39602a..0193eae 100644
--- a/src/plm/universe/bugglequest/BuggleWorld.html
+++ b/src/plm/universe/bugglequest/BuggleWorld.html
@@ -21,9 +21,9 @@ paint the ground, hit walls, etc.
           [!java]void [/!]setPos([!java]int [/!]x[!scala]:Int[/!], [!java]int [/!]y[!scala]:Int[/!])</td></tr>
 
 <tr><td colspan=2 align=center><b>Information on the buggle</b></td></tr>
-  <tr><td><b>Get the color<br/>Set the color</b></td>
-      <td>[!java]Color [/!]getColor()[!scala]:Color[/!]<br/>
-          [!java]void [/!]setColor([!java]Color [/!]c[!scala]:Color[/!])</td></tr>				
+  <tr><td><b>Get the color of the body<br/>Set the color of the body</b></td>
+      <td>[!java]Color [/!]getBodyColor()[!scala]:Color[/!]<br/>
+          [!java]void [/!]setBodyColor([!java]Color [/!]c[!scala]:Color[/!])</td></tr>				
   <tr><td><b>Look for a wall forward<br/>Look for a wall backward</b></td>
       <td>[!java]boolean [/!]isFacingWall()[!scala]:Boolean[/!]<br/>
           [!java]boolean [/!]isBackingWall()[!scala]:Boolean[/!]</td></tr>				
@@ -62,6 +62,24 @@ paint the ground, hit walls, etc.
           [!java]void [/!]clearMessage()</td></tr>
 </table>
 
+<h2>Valid colors</h2>
+<table border=1>
+<tr><td>Name</td><td>Color</td></tr>
+<tr><td>Color.black</td>    <td BGCOLOR="#000000"> </td></tr>
+<tr><td>Color.blue</td>     <td BGCOLOR="#0000FF"> </td></tr>
+<tr><td>Color.cyan</td>     <td BGCOLOR="#00FFFF"> </td></tr>
+<tr><td>Color.darkGray</td> <td BGCOLOR="#404040"> </td></tr>
+<tr><td>Color.gray</td>     <td BGCOLOR="#808080"> </td></tr>
+<tr><td>Color.green</td>    <td BGCOLOR="#00FF00"> </td></tr>
+<tr><td>Color.lightGray</td><td BGCOLOR="#C0C0C0"> </td></tr>
+<tr><td>Color.magenta</td>  <td BGCOLOR="#FF00FF"> </td></tr>
+<tr><td>Color.orange</td>   <td BGCOLOR="#FFC800"> </td></tr>
+<tr><td>Color.pink</td>     <td BGCOLOR="#FFAFAF"> </td></tr>
+<tr><td>Color.red</td>      <td BGCOLOR="#FF0000"> </td></tr>
+<tr><td>Color.white</td>    <td BGCOLOR="#FFFFFF"> </td></tr>
+<tr><td>Color.yellow</td>   <td BGCOLOR="#FFFF00"> </td></tr>
+</table>
+
 <h2>Note on exceptions</h2>
 Regular buggles throw a BuggleWallException exception if you ask them to
 traverse a wall.  They throw a NoBaggleUnderBuggleException exception if you
diff --git a/src/plm/universe/bugglequest/BuggleWorld.java b/src/plm/universe/bugglequest/BuggleWorld.java
index 6a0c4d4..c69c1f3 100644
--- a/src/plm/universe/bugglequest/BuggleWorld.java
+++ b/src/plm/universe/bugglequest/BuggleWorld.java
@@ -291,7 +291,7 @@ public class BuggleWorld extends GridWorld {
 			if (b.getDirection().equals(Direction.WEST)) 
 				writer.write("west,");
 			
-			writer.write(ColorMapper.color2name(b.getColor())+",");
+			writer.write(ColorMapper.color2name(b.getBodyColor())+",");
 			writer.write(ColorMapper.color2name(b.getBrushColor())+",");
 			writer.write(b.getName());
 			writer.write("\n");
@@ -443,6 +443,10 @@ public class BuggleWorld extends GridWorld {
 				"	return entity.isFacingWall()\n"+
 				"def isBackingWall():" +
 				"	return entity.isBackingWall()\n"+
+				"def getBodyColor():\n"+
+				"   return entity.getBodyColor()\n"+
+				"def setBodyColor(c):\n"+
+				"   return setBodyColor(c)\n"+
 				"def getGroundColor():\n"+
 				"   return entity.getGroundColor()\n"+
 				
@@ -525,9 +529,14 @@ public class BuggleWorld extends GridWorld {
 				"def ecritMessage(msg):\n"+
 				"   entity.writeMessage(msg)\n"+
 				
-				"def setBrossehCouleur(c):\n"+
+				"def getCouleurCorps():\n"+
+				"   return entity.getBodyColor()\n"+
+				"def setCouleurCorps(c):\n"+
+				"   return setBodyColor(c)\n"+
+				
+				"def setCouleurBrosse(c):\n"+
 				"    entity.setBrushColor(c)\n"+
-				"def getBrosseCouleur():\n"+
+				"def getCouleurBrosse():\n"+
 				"    return entity.getBrushColor()\n"
 						);		
 		} else {
diff --git a/src/plm/universe/bugglequest/ui/BuggleButtonPanel.java b/src/plm/universe/bugglequest/ui/BuggleButtonPanel.java
index 519148b..4313195 100644
--- a/src/plm/universe/bugglequest/ui/BuggleButtonPanel.java
+++ b/src/plm/universe/bugglequest/ui/BuggleButtonPanel.java
@@ -141,14 +141,14 @@ public class BuggleButtonPanel extends EntityControlPanel {
 		
 		buggleColorComboBox=new JComboBox (colors);
 		buggleColorComboBox.setRenderer(new BuggleColorCellRenderer());
-		buggleColorComboBox.setSelectedItem(((AbstractBuggle)Game.getInstance().getSelectedEntity()).getColor());
+		buggleColorComboBox.setSelectedItem(((AbstractBuggle)Game.getInstance().getSelectedEntity()).getBodyColor());
 		buggleColorComboBox.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent event) {
 				JComboBox cb = (JComboBox) event.getSource();
 				Color c = (Color) cb.getSelectedItem();
 				cb.setSelectedItem(c);
 				echo(i18n.tr("setColor(Color.{0})",ColorMapper.color2name(c)));
-				((AbstractBuggle)Game.getInstance().getSelectedEntity()).setColor(c);
+				((AbstractBuggle)Game.getInstance().getSelectedEntity()).setBodyColor(c);
 			}
 		});
 	}
diff --git a/src/plm/universe/bugglequest/ui/BuggleWorldView.java b/src/plm/universe/bugglequest/ui/BuggleWorldView.java
index 7e706d0..c200a1b 100644
--- a/src/plm/universe/bugglequest/ui/BuggleWorldView.java
+++ b/src/plm/universe/bugglequest/ui/BuggleWorldView.java
@@ -181,7 +181,7 @@ public class BuggleWorldView extends WorldView {
 			else
 				g.setColor(Color.BLACK);
 		} else
-			g.setColor(b.getColor());
+			g.setColor(b.getBodyColor());
 
 		if (((BuggleWorld)world).easter) {
 			try {
diff --git a/src/plm/universe/sort/SortingWorld.fr.html b/src/plm/universe/sort/SortingWorld.fr.html
index 2baf0af..a985766 100644
--- a/src/plm/universe/sort/SortingWorld.fr.html
+++ b/src/plm/universe/sort/SortingWorld.fr.html
@@ -56,7 +56,7 @@ l'état courant du monde et la vue de son histoire.</p>
 première vue. Le temps s'écoule de gauche à droite, et les cases du tableau
 sont représentée de haut en bas. Les lignes de différentes couleurs qui
 serpentent représentent les différentes valeurs contenues dans le
-tableau. Quand deux lignes se croises, cela signifie que les valeurs du
+tableau. Quand deux lignes se croisent, cela signifie que les valeurs du
 tableau ont été échangées à ce moment de l'historique; un embranchement
 signifie que la valeur a été copiée; une valeur en violet suivie d'un point
 d'interrogation a été lue avec getValeur() et une valeur en rouge suivie
diff --git a/src/plm/universe/sort/SortingWorld.java b/src/plm/universe/sort/SortingWorld.java
index 300af35..ad7444d 100644
--- a/src/plm/universe/sort/SortingWorld.java
+++ b/src/plm/universe/sort/SortingWorld.java
@@ -36,7 +36,10 @@ public class SortingWorld extends World {
 	}
 	public SortingWorld(String name, int nbValues, boolean someoneHomeOk) {
 		super(name);
-		setDelay(50);
+		if (nbValues>100)
+			setDelay(1);
+		else
+			setDelay(50);
 		this.values = new int[nbValues];
 		for (int i=0 ; i< this.values.length ; i++) 
 			this.values[i] = i;
@@ -76,21 +79,57 @@ public class SortingWorld extends World {
 			if ( this.values[i] != other.values[i] )
 				return false;
 		
-		if (operations.size() != other.operations.size())
-			return false;
-		for (int i = 0 ; i < this.operations.size() ; i++) 
-			if (! operations.get(i).equals( other.operations.get(i)) )
-				return false;
-		
 		if (! (this.readCount == other.readCount) )
 			return false;
 		if (! (this.writeCount == other.writeCount) )
 			return false;
 		
+		/* Do not compare the operation order as it's not part of the problem specification
+		 * 
+		 * If you want to add this again, please make sure that swap(i,j) is equal to swap(j,i)
+		 
+		if (operations.size() != other.operations.size())
+			return false;
+		for (int i = 0 ; i < this.operations.size() ; i++) 
+			if (! operations.get(i).equals( other.operations.get(i)) )
+				return false;
+		*/
 		return true;
 	}
 
 	/**
+	 * Make a textual description of the differences between the caller and world
+	 * @param world : the world with which you want to compare your world
+	 * @return A textual description of the differences between the caller and world
+	 */
+	@Override
+	public String diffTo(World world) {
+		String s ;
+		if (world == null || !(world instanceof SortingWorld)) {
+			s="This is not a world of sorting :(";
+		} else {
+			SortingWorld other = (SortingWorld) world;
+			StringBuffer sb = new StringBuffer();
+			
+			if (this.values.length != other.values.length)
+				sb.append(Game.i18n.tr("This is very weird: There is not the same amount of values! Expected: {0}; Found: {1}\n",this.values.length,other.values.length));
+			
+			if ( this.readCount != other.readCount )
+				sb.append(Game.i18n.tr("Invalid read count. Expected: {0}; Found: {1}\n",this.readCount,other.readCount));
+			
+			if ( this.writeCount != other.writeCount )
+				sb.append(Game.i18n.tr("Invalid write count. Expected: {0}; Found: {1}\n",this.writeCount,other.writeCount));
+			
+			for (int i = 0 ; i < this.values.length ; i++) 
+				if ( this.values[i] != other.values[i] )
+					sb.append(Game.i18n.tr("Value at index {0} differs. Expected {1}; Found {2}\n",val2str(values[i],values.length),val2str(other.values[i],other.values.length)));
+					
+			s = sb.toString();
+		}
+		return s;
+	}
+
+	/**
 	 * Tells if the array is Sorted or not
 	 */
 	private boolean isSorted() {
@@ -124,35 +163,6 @@ public class SortingWorld extends World {
 		this.values[to] = this.values[from];
 	}
 
-	/**
-	 * Make a textual description of the differences between the caller and world
-	 * @param world : the world with which you want to compare your world
-	 * @return A textual description of the differences between the caller and world
-	 */
-	@Override
-	public String diffTo(World world) {
-		String s ;
-		if (world == null || !(world instanceof SortingWorld)) {
-			s="This is not a world of sorting :(";
-		} else {
-			SortingWorld other = (SortingWorld) world;
-			StringBuffer sb = new StringBuffer();
-			if ( this.readCount != other.readCount )
-				sb.append("Invalid read count : expected "+this.readCount+" found "+other.readCount+"\n");
-			
-			if ( this.writeCount != other.writeCount )
-				sb.append("Invalid write count : expected "+this.writeCount+" found "+other.writeCount+"\n");
-			
-			for (int i = 0 ; i < this.values.length ; i++) 
-				if ( this.values[i] != other.values[i] )
-					sb.append("Index "+i+": expected "+this.values[i]+" found "+other.values[i]+"\n");
-					
-			s = sb.toString();
-		}
-		return s;
-	}
-
-
 	/** Returns the panel which let the user to interact dynamically with the world */
 	@Override
 	public EntityControlPanel getEntityControlPanel() {
@@ -338,10 +348,10 @@ public class SortingWorld extends World {
 	 * @param j the index of the second cell concerned
 	 */
 	public void swap(int i, int j) {
-		if (i<0) throw new RuntimeException("Out of bounds in swap("+i+","+j+"): "+i+"<0");
-		if (j<0) throw new RuntimeException("Out of bounds in swap("+i+","+j+"): "+j+"<0");
-		if (i>=getValueCount()) throw new RuntimeException("Out of bounds in swap("+i+","+j+"), "+i+">= value count");
-		if (j>=getValueCount()) throw new RuntimeException("Out of bounds in swap("+i+","+j+"), "+j+">= value count");
+		if (i<0) throw new RuntimeException(Game.i18n.tr("Out of bounds in swap({0},{1}): {2}<0",i,j,i));
+		if (j<0) throw new RuntimeException(Game.i18n.tr("Out of bounds in swap({0},{1}): {2}<0",i,j,j));
+		if (i>=getValueCount()) throw new RuntimeException(Game.i18n.tr("Out of bounds in swap({0},{1}): {2}>value count",i,j,i));
+		if (j>=getValueCount()) throw new RuntimeException(Game.i18n.tr("Out of bounds in swap({0},{1}): {2}>value count",i,j,j));
 
 		this.operations.add(new Swap(i, j));
 
@@ -363,4 +373,23 @@ public class SortingWorld extends World {
 		this.values[j] = tmp;
 	}
 
+	/** Make a string representation of the value to be sorted
+	 * 
+	 *  It's a bad idea to display integer values because the students mix the indexes 
+	 *  and the values. It's better to use a string representation for that. 
+	 *  
+	 *  WARNING, this function is duplicated in SortingWorldView. Yes, I fell ashamed.
+	 */
+	protected String val2str(int value,int amountOfValues) {
+		String letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+		if (amountOfValues<26) {
+			return letters.substring(value, value+1);
+		} 
+		if (amountOfValues < 26*26) {
+			return   letters.substring(value/26, (value/26)+1 )
+					+letters.substring(value%26, (value%26)+1 );
+		}
+		return ""+value;
+	}
+
 }
diff --git a/src/plm/universe/sort/SortingWorldView.java b/src/plm/universe/sort/SortingWorldView.java
index 8a6f755..c6748dc 100644
--- a/src/plm/universe/sort/SortingWorldView.java
+++ b/src/plm/universe/sort/SortingWorldView.java
@@ -92,6 +92,25 @@ public class SortingWorldView extends WorldView {
 		this.addMouseListener(popupListener);
 	}
 
+	/** Make a string representation of the value to be sorted
+	 * 
+	 *  It's a bad idea to display integer values because the students mix the indexes 
+	 *  and the values. It's better to use a string representation for that. 
+	 *  
+	 *  WARNING, this function is duplicated in SortingWorld. Yes, I fell ashamed.
+	 */
+	protected String val2str(int value,int amountOfValues) {
+		String letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+		if (amountOfValues<26) {
+			return letters.substring(value, value+1);
+		} 
+		if (amountOfValues < 26*26) {
+			return   letters.substring(value/26, (value/26)+1 )
+					+letters.substring(value%26, (value%26)+1 );
+		}
+		return ""+value;
+	}
+	
 	/**
 	 * Draw the Chrono view
 	 * @param g2 some 2D graphics
@@ -120,7 +139,7 @@ public class SortingWorldView extends WorldView {
 
 				//If the array is small enough, we print the values
 				if (drawStr) 
-					g2.drawString("" + we.getValues()[valueIdx], 0, y1);
+					g2.drawString(val2str(we.getValues()[valueIdx],we.getValueCount()), 0, y1);
 			}
 			return;
 		}
@@ -128,9 +147,9 @@ public class SortingWorldView extends WorldView {
 		// Draw the values at the very left of the figure (in any case)
 		for (int valueIdx = 0; valueIdx < we.getValueCount(); valueIdx++) { 
 			y1 = (int) (valueIdx * stepY + stepY/2);
-			tone = getValueColor(we.getInitValues()[valueIdx],we.getValueCount());
+			tone =  getValueColor(we.getInitValues()[valueIdx],we.getValueCount());
 			g2.setColor(new Color(tone, tone, 128));
-			g2.drawString("" + we.getInitValues()[valueIdx], 0, y1);
+			g2.drawString(val2str(we.getInitValues()[valueIdx],we.getValueCount()), 0, y1);
 		}
 		
 		int[] valuesAfter = new int[we.getInitValues().length];
@@ -167,7 +186,7 @@ public class SortingWorldView extends WorldView {
 					
 					tone = getValueColor(valuesAfter[valIdx],we.getValueCount());
 					g2.setColor(new Color(tone, tone, 128));
-					g2.drawString("" + valuesAfter[valIdx], x2, y1);		
+					g2.drawString(val2str(we.getValues()[valIdx],we.getValueCount()), x2, y1);		
 				}
 			
 			/* Draw the lines depicting the current operation */
@@ -211,7 +230,7 @@ public class SortingWorldView extends WorldView {
 				
 					tone = getValueColor(valuesAfter[op.source],we.getValueCount());
 					g2.setColor(Color.red);
-					g2.drawString("" + valuesAfter[op.source]+"!", x2, y1);
+					g2.drawString(val2str(valuesAfter[op.source],we.getValueCount())+"!", x2, y1);
 				}
 
 				/* Don't draw a line for the modified value, actually */
@@ -223,7 +242,7 @@ public class SortingWorldView extends WorldView {
 				
 					tone = getValueColor(valuesAfter[pos],we.getValueCount());
 					g2.setColor(Color.MAGENTA);
-					g2.drawString("" + valuesAfter[pos]+"?", x2, y1);
+					g2.drawString(val2str(valuesAfter[pos],we.getValueCount())+"?", x2, y1);
 				}
 			} else {
 				System.out.println("This operation is not depicted because that's a "+op.toString()+"; please report this bug.");
@@ -256,7 +275,7 @@ public class SortingWorldView extends WorldView {
 			g2.setColor(Color.black);
 			g2.draw(rect);
 			if (scale > 20) 
-				g2.drawString(""+values[i], (int)scale*i+(int)scale/2, maxSize-2);
+				g2.drawString(val2str(values[i],world.getValueCount()) , (int)scale*i+(int)scale/2, maxSize-2);
 		}
 		g2.setColor(Color.black);
 		g2.drawString(world.getName()+" ("+world.getWriteCount()+" write, "+world.getReadCount()+" read)", 0, 15);
diff --git a/src/plm/universe/turtles/Line.java b/src/plm/universe/turtles/Line.java
index 19ffbc1..dfbd863 100644
--- a/src/plm/universe/turtles/Line.java
+++ b/src/plm/universe/turtles/Line.java
@@ -4,17 +4,39 @@ import java.awt.Color;
 import java.awt.Graphics2D;
 import java.awt.geom.Line2D;
 
+import plm.core.model.Game;
+
 
 public class Line implements Shape {
 	public double x1, y1,  x2, y2;
 	public Color color;
 	
 	public Line(double x1, double y1, double x2, double y2, Color color) {
-		this.x1 = x1;
-		this.y1 = y1;
-		this.x2 = x2;
-		this.y2 = y2;
 		this.color = color;
+		/* make sure that the first point of each segment is before the second point in comparison order */ 
+		if (doubleEqual(x1, x2)) { // Don't check if x1<x2 before checking their approximate equality
+			if (y1 < y2) { // already in right order
+				this.x1 = x1;
+				this.y1 = y1;
+				this.x2 = x2;
+				this.y2 = y2;				
+			} else { // invert both sides
+				this.x1 = x2;
+				this.y1 = y2;
+				this.x2 = x1;
+				this.y2 = y1;
+			}
+		} else if (x1<x2) {
+			this.x1 = x1;
+			this.y1 = y1;
+			this.x2 = x2;
+			this.y2 = y2;				
+		} else {
+			this.x1 = x2;
+			this.y1 = y2;
+			this.x2 = x1;
+			this.y2 = y1;			
+		}
 	}
 	
 	public void draw(Graphics2D g){
@@ -26,7 +48,7 @@ public class Line implements Shape {
 		return new Line(x1,y1,x2,y2,color);
 	}
 	private boolean doubleEqual(double a, double b) {
-		return (Math.abs(a-b)<0.000001);
+		return (Math.abs(a-b)<0.001);
 	}
 	
 	@Override
@@ -43,27 +65,29 @@ public class Line implements Shape {
 			return false;
 		if (!doubleEqual(y2,other.y2))
 			return false;
-				
-		return true;
+		
+		return color.equals(other.color);
 	}
 	public String diffTo(Shape o) {
 		if (o instanceof Line) {
 			Line other = (Line) o;
 			if (!doubleEqual(x1,other.x1))
-				return "x1 differs";
+				return Game.i18n.tr("x1 differs.");
 			if (!doubleEqual(x2,other.x2))
-				return "x2 differs";
+				return Game.i18n.tr("x2 differs.");
 			if (!doubleEqual(y1,other.y1))
-				return "y1 differs";
+				return Game.i18n.tr("y1 differs.");
 			if (!doubleEqual(y2,other.y2))
-				return "y2 differs";
-			return "I dont see the difference";
+				return Game.i18n.tr("y2 differs.");
+			if (!color.equals(other.color))
+				return Game.i18n.tr("The color differs.");
+			return Game.i18n.tr("I dont see the difference (please report this bug).");
 		} else 
-			return "That's not a line";
+			return Game.i18n.tr("That's not a line.");
 	}
 	
 	@Override
 	public String toString(){
-		return "Line ("+x1+","+y1+";"+x2+","+y2+";"+color+")";
+		return String.format("Line (x%.3f y%.3f / x%.3f y%.3f / %s)", x1,y1,x2,y2,plm.core.utils.ColorMapper.color2name(color));
 	}
 }
diff --git a/src/plm/universe/turtles/TurtleWorld.fr.html b/src/plm/universe/turtles/TurtleWorld.fr.html
index 30fc5c5..5881b36 100644
--- a/src/plm/universe/turtles/TurtleWorld.fr.html
+++ b/src/plm/universe/turtles/TurtleWorld.fr.html
@@ -66,3 +66,22 @@ Modifier la couleur du stylo.
 
 <pre>[!java]boolean [/!]estChoisie()[!scala]:Boolean[/!]</pre>
 Renvoie si la tortue actuelle est sélectionnée dans l'interface graphique.
+
+<h2>Couleurs valides</h2>
+<table border=1>
+<tr><td>Nom</td><td>Couleur</td></tr>
+<tr><td>Color.black</td>    <td BGCOLOR="#000000"> </td></tr>
+<tr><td>Color.blue</td>     <td BGCOLOR="#0000FF"> </td></tr>
+<tr><td>Color.cyan</td>     <td BGCOLOR="#00FFFF"> </td></tr>
+<tr><td>Color.darkGray</td> <td BGCOLOR="#404040"> </td></tr>
+<tr><td>Color.gray</td>     <td BGCOLOR="#808080"> </td></tr>
+<tr><td>Color.green</td>    <td BGCOLOR="#00FF00"> </td></tr>
+<tr><td>Color.lightGray</td><td BGCOLOR="#C0C0C0"> </td></tr>
+<tr><td>Color.magenta</td>  <td BGCOLOR="#FF00FF"> </td></tr>
+<tr><td>Color.orange</td>   <td BGCOLOR="#FFC800"> </td></tr>
+<tr><td>Color.pink</td>     <td BGCOLOR="#FFAFAF"> </td></tr>
+<tr><td>Color.red</td>      <td BGCOLOR="#FF0000"> </td></tr>
+<tr><td>Color.white</td>    <td BGCOLOR="#FFFFFF"> </td></tr>
+<tr><td>Color.yellow</td>   <td BGCOLOR="#FFFF00"> </td></tr>
+</table>
+
diff --git a/src/plm/universe/turtles/TurtleWorld.html b/src/plm/universe/turtles/TurtleWorld.html
index 7465581..3659b49 100644
--- a/src/plm/universe/turtles/TurtleWorld.html
+++ b/src/plm/universe/turtles/TurtleWorld.html
@@ -64,3 +64,22 @@ Changes the pen color.
 
 <pre>[!java]boolean [/!]isSelected()[!scala]:Boolean[/!]</pre>
 Returns whether the current turtle is selected in the graphical interface.
+
+<h2>Valid colors</h2>
+<table border=1>
+<tr><td>Name</td><td>Color</td></tr>
+<tr><td>Color.black</td>    <td BGCOLOR="#000000"> </td></tr>
+<tr><td>Color.blue</td>     <td BGCOLOR="#0000FF"> </td></tr>
+<tr><td>Color.cyan</td>     <td BGCOLOR="#00FFFF"> </td></tr>
+<tr><td>Color.darkGray</td> <td BGCOLOR="#404040"> </td></tr>
+<tr><td>Color.gray</td>     <td BGCOLOR="#808080"> </td></tr>
+<tr><td>Color.green</td>    <td BGCOLOR="#00FF00"> </td></tr>
+<tr><td>Color.lightGray</td><td BGCOLOR="#C0C0C0"> </td></tr>
+<tr><td>Color.magenta</td>  <td BGCOLOR="#FF00FF"> </td></tr>
+<tr><td>Color.orange</td>   <td BGCOLOR="#FFC800"> </td></tr>
+<tr><td>Color.pink</td>     <td BGCOLOR="#FFAFAF"> </td></tr>
+<tr><td>Color.red</td>      <td BGCOLOR="#FF0000"> </td></tr>
+<tr><td>Color.white</td>    <td BGCOLOR="#FFFFFF"> </td></tr>
+<tr><td>Color.yellow</td>   <td BGCOLOR="#FFFF00"> </td></tr>
+</table>
+
diff --git a/src/plm/universe/turtles/TurtleWorld.java b/src/plm/universe/turtles/TurtleWorld.java
index 7ad3dae..50934f0 100644
--- a/src/plm/universe/turtles/TurtleWorld.java
+++ b/src/plm/universe/turtles/TurtleWorld.java
@@ -128,14 +128,15 @@ public class TurtleWorld extends World {
 			return false;
 		
 		TurtleWorld other = (TurtleWorld) obj;
-		if (shapes.size() != other.shapes.size())
-			return false;
-		Collections.sort(shapes, new ShapeComparator());
-		Collections.sort(other.shapes, new ShapeComparator());
-		for (int i=0;i<shapes.size();i++)
-			if (! shapes.get(i).equals(other.shapes.get(i)))
+		synchronized (shapes) { synchronized (other.shapes) {
+			if (shapes.size() != other.shapes.size())
 				return false;
-		
+			Collections.sort(shapes, new ShapeComparator());
+			Collections.sort(other.shapes, new ShapeComparator());
+			for (int i=0;i<shapes.size();i++)
+				if (! shapes.get(i).equals(other.shapes.get(i)))
+					return false;
+		}}		
 		return true;
 	}
 	
@@ -147,9 +148,11 @@ public class TurtleWorld extends World {
 			", size="+width+"x"+height+
 			", parameters: " +parameters+
 			", shapes=[";
-		Iterator<Shape> it = shapes();
-		while (it.hasNext()) 
-			res += it.next().toString();
+		synchronized (shapes) {
+			Iterator<Shape> it = shapes();
+			while (it.hasNext()) 
+				res += it.next().toString();
+		}
 		res += "]";
 		return res;
 	}
@@ -226,13 +229,18 @@ public class TurtleWorld extends World {
 	public String diffTo(World world) {
 		StringBuffer sb = new StringBuffer();
 		TurtleWorld other = (TurtleWorld) world;
-		if (shapes.size() != other.shapes.size())
-			sb.append("  There is only "+other.shapes.size()+" lines where "+shapes.size()+" were expected.\n");
-		for (int i=0;i<other.shapes.size();i++)
-			if (! other.shapes.get(i).equals(shapes.get(i)))
-				sb.append("  Got "+other.shapes.get(i)+" where "+shapes.get(i)+" were expected ("+
-						((Line) other.shapes.get(i)).diffTo(shapes.get(i))+")\n");
-		
+		synchronized (shapes) { synchronized (other.shapes) {
+			ShapeComparator cmp = new ShapeComparator();
+			Collections.sort(shapes, cmp);
+			Collections.sort(other.shapes, cmp);
+			if (shapes.size() != other.shapes.size())
+				sb.append(Game.i18n.tr("  There is only {0} shapes where {1} shapes were expected\n",other.shapes.size()+shapes.size()));
+			for (int i=0;i<other.shapes.size();i++)
+				if (! other.shapes.get(i).equals(shapes.get(i)))
+					sb.append(Game.i18n.tr("  {0} (got {1} instead of {2})\n",
+							((Shape) other.shapes.get(i)).diffTo(shapes.get(i)),
+							other.shapes.get(i),shapes.get(i)));
+		} }
 		return sb.toString();
 	}
 }
@@ -243,6 +251,14 @@ class ShapeComparator implements Comparator<Shape> {
 		super();
 	}
 
+	int cmp(double a, double b) {
+		if (Math.abs(a-b)<0.001)
+			return 0;
+		if (a<b)
+			return 1;
+		return -1;
+	}
+	
 	@Override
 	public int compare(Shape s1, Shape s2) {
 		if (s1 instanceof Line && s2 instanceof Circle)
@@ -253,34 +269,37 @@ class ShapeComparator implements Comparator<Shape> {
 		if (s1 instanceof Line) {
 			Line l1 = (Line) s1;
 			Line l2 = (Line) s2;
-			if (l1.x1 < l2.x1)
-				return -1;
-			if (l1.x1 > l2.x1)
-				return 1;
-
-			if (l1.x2 < l2.x2)
-				return -1;
-			if (l1.x2 > l2.x2)
-				return 1;
-
-			if (l1.y1 < l2.y1)
-				return -1;
-			if (l1.y1 > l2.y1)
-				return 1;
+			
+			int res = cmp(l1.x1, l2.x1);
+			if (res != 0)
+				return res;
+			
+			res = cmp(l1.y1, l2.y1);
+			if (res != 0)
+				return res;
+			
+			res = cmp(l1.x2, l2.x2);
+			if (res != 0)
+				return res;
 
-			if (l1.y2 < l2.y2)
-				return -1;
-			if (l1.y2 > l2.y2)
-				return 1;
-			return 0;
+			return cmp(l1.y2, l2.y2);
 		}
+		
 		if (s1 instanceof Circle) {
 			Circle c1 = (Circle) s1;
 			Circle c2 = (Circle) s2;
-			if (c1.x < c2.x)
-				return -1;
-			if (c1.x > c2.x)
-				return 1;
+		
+			int res = cmp(c1.x, c2.x);
+			if (res != 0)
+				return res;
+			
+			res = cmp(c1.y, c2.y);
+			if (res != 0)
+				return res;
+			
+			res = cmp(c1.radius, c2.radius);
+			if (res != 0)
+				return res;
 		}
 		return 0;
 	}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/plm.git



More information about the pkg-java-commits mailing list