diff --git a/include/neighborhoodrule.hpp b/include/neighborhoodrule.hpp
index d4c34450cdf7442322fe2e7ec6e5c73f4c6e21c2..97ae842ba6f27c74d49a690488d5bc9c8bd00b89 100644
--- a/include/neighborhoodrule.hpp
+++ b/include/neighborhoodrule.hpp
@@ -46,10 +46,10 @@ public:
     //! \return Retourne les formats de voisinage possible dans un std::vector.
     virtual std::vector<NeighborhoodFormat> getFormats() const = 0;
 
-    //! \brief Fait avancer l'état de la règle de voisinage d'une génération
-    // Fait avancer l'état de la règle de voisinage d'une génération. Cette fonction est utilisée pour les voisinages tels que celui de Margolus, qui dépendent de la parité de la génération actuelle.
-    // \remark L'implémentation par défaut ne fait rien.
-    virtual void step() {}
+    //! \brief Change le numéro de génération de la règle de voisinage d'une génération
+    //! Fait avancer ou reculer l'état de la règle de voisinage d'une génération. Cette fonction est utilisée pour les voisinages tels que celui de Margolus, qui dépendent de la parité de la génération actuelle.
+    //! \remark L'implémentation par défaut ne fait rien.
+    virtual void update_generation(unsigned gen) {}
 };
 
 #endif // NEIGHBORHOODRULE_HPP
diff --git a/src/interface.cpp b/src/interface.cpp
index 5729509d238b0af9174bf54ae9cf7b1c82a6d244..9aef10557387ee2ff79376d9cef84c6e4ba4a35f 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -387,6 +387,7 @@ void MainWindow::load_model(const QJsonObject &obj)
     // On transfère la propriété de ces pointeurs vers Simulation, qui en est désormais propriétaire pour l'exécution de l'automate
     simulation.setNeighborhoodRule(m_neighborhood_rule);
     simulation.setTransitionRule(m_transition_rule);
+    simulation.reset();
     ui_update_alphabet(alpha);
 
     m_loaded_model = obj;
diff --git a/src/simulation.cpp b/src/simulation.cpp
index f72ac6f2117c060db5104b002b88df84cbeb2612..acc836b6532a5bd43726c8a41b813b9126f0674e 100644
--- a/src/simulation.cpp
+++ b/src/simulation.cpp
@@ -58,7 +58,7 @@ void Simulation::resize(size_t l,size_t c) {
     reset();
 }*/
 
-void Simulation::reset() {
+    void Simulation::reset() {
     automaton.setGrid(startGrid);
     time = 0;
     period = 0;
@@ -69,10 +69,10 @@ void Simulation::step() {
     if(!canRun) {
         return;
     }
+    ++time;
     hist.pushGrid(automaton.getGrid());
     automaton.runOnce();
-    automaton.getNeighborhoodRule()->step();
-    ++time;
+    automaton.getNeighborhoodRule()->update_generation(time);
     if(!period && startGrid == automaton.getGrid()) {
         period = time;
     }
@@ -81,10 +81,10 @@ void Simulation::step() {
 bool Simulation::back() {
     bool r=false;
     if(!hist.isEmpty()) {
+        --time;
         automaton.setGrid(hist.topGrid());
-        //automaton.getNeighborhoodRule()->back();
+        automaton.getNeighborhoodRule()->update_generation(time);
         hist.popGrid();
-        --time;
         r=true;
     }
     return r;