diff --git a/shukan/ShukanController.java b/shukan/ShukanController.java
index 7ad2f7b25971399fa6b810090b130c7f6229c5e6..772bc3421324cba5d1a99a3ee74dc89c3a3ca798 100644
--- a/shukan/ShukanController.java
+++ b/shukan/ShukanController.java
@@ -2,6 +2,7 @@ package shukan;
 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
+import java.util.Stack;
 
 
 /**
@@ -17,6 +18,7 @@ public class ShukanController
   private ShukanViewBar bar;
   /** Controlled application data. */
   private ShukanData data;
+  private Stack<Integer> actionStack;
 
    /** Constructs a event handler.
     * @param canvas display area.
@@ -25,6 +27,7 @@ public class ShukanController
       this.canvas = canvas;
       this.bar = bar;
       this.data = data;
+      this.actionStack = new Stack<>();
     }
 
 
@@ -55,6 +58,13 @@ public class ShukanController
   {
     switch (e.getKeyCode ())
     {
+      case KeyEvent.VK_Z :
+        if (pressed && e.isControlDown ())
+        {
+          int lastAction = actionStack.pop();
+          revertAction(lastAction);
+        }
+        break;
       case KeyEvent.VK_Q :
       case KeyEvent.VK_ESCAPE :
         if (! pressed)
@@ -92,7 +102,34 @@ public class ShukanController
     }
   }
 
-  
+private void revertAction(int action)
+{
+  switch (action)
+  {
+    case 0:
+      canvas.deleteActivity();
+      canvas.repaint();
+      break;
+    case 1:
+      System.out.println("revert delete activity");
+      break;
+    case 2:
+      data.followRight();
+      canvas.repaint();
+      break;
+    case 3:
+      data.followLeft();
+      canvas.repaint();
+      break;
+    case 4:
+      data.exchangeExtremes ();
+      canvas.repaint ();
+      break;
+    case 5:
+      data.toggleCursus(false);
+      canvas.repaint();
+  }
+}
 
   /** Invoked when a key has been typed.
     * Implementation from KeyListener.
@@ -201,37 +238,47 @@ public class ShukanController
    * @param e detected action event
    * */
   public void actionPerformed(ActionEvent e){
-    if (e.getSource()== bar.buttons[0])
+    if (e.getSource()== bar.buttons[0]) {
       canvas.saveData ();
-    else if (e.getSource()== bar.buttons[1])
-      System.out.println("back");
+    }
+    else if (e.getSource()== bar.buttons[1]) {
+      int lastAction = actionStack.pop();
+      revertAction(lastAction);
+    }
     else if (e.getSource()==bar.buttons[2])
     {
       canvas.newActivity();
       canvas.repaint();
+      actionStack.push(0);
+    }
+    else if (e.getSource()==bar.buttons[3])
+    {
+      canvas.deleteActivity();
+      actionStack.push(1);
     }
-    else if (e.getSource()==bar.buttons[3]) canvas.deleteActivity();
 
-    else if (e.getSource()==bar.buttons[4]) {if (data.followLeft ()) canvas.repaint ();}
+    else if (e.getSource()==bar.buttons[4]) {if (data.followLeft ()) {canvas.repaint (); actionStack.push(2);}}
 
-    else if (e.getSource()==bar.buttons[5]) {if (data.followRight ()) canvas.repaint ();}
+    else if (e.getSource()==bar.buttons[5]) {if (data.followRight ()) {canvas.repaint (); actionStack.push(3);}}
 
     else if (e.getSource()== bar.buttons[6])
     {
       data.exchangeExtremes ();
       canvas.repaint ();
+      actionStack.push(4);
     }
 
     else if (e.getSource()== bar.buttons[7])
     {
       data.toggleCursus(false);
       canvas.repaint();
+      actionStack.push(5);
     }
       //if (data.followRight ()) canvas.repaint ();
     else if (e.getSource()==bar.buttons[8])
       new ShukanTex (data);
     else if (e.getSource()==bar.buttons[9]){
-    
+
       EventQueue.invokeLater(() -> {
         ShukanParameters myParameters = new ShukanParameters("Changer de thème", canvas);
         myParameters.setSize(300, 300);