diff --git a/dev/src/dev.cpp b/dev/src/dev.cpp
index d33d37063d2761c0500755bc76b70a4687ac3aab..c538b98dcec2753c5588697de57239e76b36a29f 100644
--- a/dev/src/dev.cpp
+++ b/dev/src/dev.cpp
@@ -8,23 +8,49 @@
 
 int main(int argc, char * argv[])
 {
-  /*
-  BaseConfig goldConfig(argv[3], argv[1], argv[2]);
+  if (argc != 5)
+  {
+    fmt::print(stderr, "needs 4 arguments.\n");
+    exit(1);
+  }
+
+  std::string machineFile = argv[1];
+  std::string mcdFile = argv[2];
+  std::string tsvFile = argv[3];
+  //std::string rawFile = argv[4];
+  std::string rawFile = "";
+
+  ReadingMachine machine(machineFile);
 
+  BaseConfig goldConfig(mcdFile, tsvFile, rawFile);
   SubConfig config(goldConfig);
-  auto other = config;
 
-  while (config.moveWordIndex(1))
+  config.setState(machine.getStrategy().getInitialState());
+
+  config.printForDebug(stderr);
+
+  while (true)
   {
+    auto * transition = machine.getTransitionSet().getBestAppliableTransition(config);
+    if (!transition)
+      util::myThrow("No transition appliable !");
+
+    fmt::print(stderr, "Transition : {}\n", transition->getName());
+    transition->apply(config);
+
+    auto movement = machine.getStrategy().getMovement(config, transition->getName());
+    if (movement == Strategy::endMovement)
+      break;
+
+    config.setState(movement.first);
+    if (!config.moveWordIndex(movement.second))
+      util::myThrow("Cannot move word index !");
+
     if (config.needsUpdate())
       config.update();
-  }
-
-  fmt::print(stderr, "ok\n");
-  std::scanf("%*c");
-  */
 
-  ReadingMachine machine(argv[1]);
+    config.printForDebug(stderr);
+  }
 
   return 0;
 }
diff --git a/reading_machine/include/Classifier.hpp b/reading_machine/include/Classifier.hpp
index ce61d5a6c850dc5efab0a9cd70acb2282168717c..5d38ae88ec4e893b523e6fcd17391e0957cc4934 100644
--- a/reading_machine/include/Classifier.hpp
+++ b/reading_machine/include/Classifier.hpp
@@ -16,6 +16,7 @@ class Classifier
   public :
 
   Classifier(const std::string & name, const std::string & topology, const std::string & tsFile);
+  TransitionSet & getTransitionSet();
 };
 
 #endif
diff --git a/reading_machine/include/ReadingMachine.hpp b/reading_machine/include/ReadingMachine.hpp
index dc4be73e0b6710f6606a7ed406acc7d5a7c90aab..ab5d79483be3f0c7b919d17de8e59b307af7ba27 100644
--- a/reading_machine/include/ReadingMachine.hpp
+++ b/reading_machine/include/ReadingMachine.hpp
@@ -16,6 +16,8 @@ class ReadingMachine
   public :
 
   ReadingMachine(const std::string & filename);
+  TransitionSet & getTransitionSet();
+  Strategy & getStrategy();
 };
 
 #endif
diff --git a/reading_machine/include/Strategy.hpp b/reading_machine/include/Strategy.hpp
index e1bc580c2dadc42d896c2c4156c6c7a8248cb274..10d96282ad9bbfe408b4708b6ba324922e6d9f60 100644
--- a/reading_machine/include/Strategy.hpp
+++ b/reading_machine/include/Strategy.hpp
@@ -21,6 +21,7 @@ class Strategy
   std::map<std::pair<std::string, std::string>, std::string> edges;
   std::map<std::string, bool> isDone;
   std::vector<std::string> defaultCycle;
+  std::string initialState{"UNDEFINED"};
 
   private :
 
@@ -31,6 +32,7 @@ class Strategy
 
   Strategy(const std::vector<std::string_view> & lines);
   std::pair<std::string, int> getMovement(const Config & c, const std::string & transition);
+  const std::string getInitialState() const;
 };
 
 #endif
diff --git a/reading_machine/include/Transition.hpp b/reading_machine/include/Transition.hpp
index ecd90dfc68380bd19de4a2b07e3ed40341103c28..cbdf21f8fda73f3f79ec462b104067642f38ecfe 100644
--- a/reading_machine/include/Transition.hpp
+++ b/reading_machine/include/Transition.hpp
@@ -23,6 +23,7 @@ class Transition
   void apply(Config & config);
   bool appliable(const Config & config) const;
   int getCost(const Config & config) const;
+  const std::string & getName() const;
 };
 
 #endif
diff --git a/reading_machine/include/TransitionSet.hpp b/reading_machine/include/TransitionSet.hpp
index 04c1e9098c330812805e308642d0e598f9fe4463..188ce70e1e4d77c3e8dfccec0f09de83d916f5eb 100644
--- a/reading_machine/include/TransitionSet.hpp
+++ b/reading_machine/include/TransitionSet.hpp
@@ -11,13 +11,13 @@ class TransitionSet
   private :
 
   std::vector<Transition> transitions;
-  std::unordered_map<std::string, std::size_t> name2index;
   std::optional<std::size_t> defaultAction;
 
   public :
 
   TransitionSet(const std::string & filename);
-  std::vector<std::pair<Transition &, int>> getAppliableTransitionsCosts(const Config & c);
+  std::vector<std::pair<Transition*, int>> getAppliableTransitionsCosts(const Config & c);
+  Transition * getBestAppliableTransition(const Config & c);
 };
 
 #endif
diff --git a/reading_machine/src/Classifier.cpp b/reading_machine/src/Classifier.cpp
index 47100c74920d8fdf399171a55b34f281ae28adc7..d446be2ce9bfe40b8502ff658a4507dc1d29adc0 100644
--- a/reading_machine/src/Classifier.cpp
+++ b/reading_machine/src/Classifier.cpp
@@ -7,3 +7,8 @@ Classifier::Classifier(const std::string & name, const std::string & topology, c
   this->nn = MLP(topology);
 }
 
+TransitionSet & Classifier::getTransitionSet()
+{
+  return *transitionSet;
+}
+
diff --git a/reading_machine/src/Config.cpp b/reading_machine/src/Config.cpp
index 1a29fff27ab39bf511cf853670a4063665e0052c..f4d1001d3d5cc35b49d352d93bc889a3b280a3bb 100644
--- a/reading_machine/src/Config.cpp
+++ b/reading_machine/src/Config.cpp
@@ -80,7 +80,9 @@ void Config::printForDebug(FILE * dest) const
 {
   static constexpr int windowSize = 5;
   static constexpr int lettersWindowSize = 40;
-  static constexpr int maxWordLength = 10;
+  static constexpr int maxWordLength = 7;
+
+  fmt::print(dest, "\n");
 
   int firstLineToPrint = wordIndex;
   int lastLineToPrint = wordIndex;
@@ -138,7 +140,8 @@ void Config::printForDebug(FILE * dest) const
   fmt::print(dest, "{}\n", longLine);
   for (std::size_t index = characterIndex; index < util::getSize(rawInput) and index - characterIndex < lettersWindowSize; index++)
     fmt::print(dest, "{}", getLetter(index));
-  fmt::print(dest, "\n{}\n", longLine);
+  if (rawInput.size())
+    fmt::print(dest, "\n{}\n", longLine);
   fmt::print(dest, "State={}\nwordIndex={} characterIndex={}\nhistory=({})\nstack=({})\n", state, wordIndex, characterIndex, historyStr, stackStr);
   fmt::print(dest, "{}\n", longLine);
 
@@ -151,8 +154,6 @@ void Config::printForDebug(FILE * dest) const
     if (toPrint[line].back() == EOSSymbol1)
       fmt::print(dest, "\n");
   }
-
-  fmt::print(dest, "\n");
 }
 
 Config::String & Config::getLastNotEmpty(int colIndex, int lineIndex)
diff --git a/reading_machine/src/ReadingMachine.cpp b/reading_machine/src/ReadingMachine.cpp
index cc484eb3c84459b7748985b24cb2b6e609a90a4c..f2d49bef54f288c70deca580d981a06b256ba556 100644
--- a/reading_machine/src/ReadingMachine.cpp
+++ b/reading_machine/src/ReadingMachine.cpp
@@ -34,3 +34,13 @@ ReadingMachine::ReadingMachine(const std::string & filename)
   } catch(std::exception & e) {util::myThrow(fmt::format("during reading of '{}' : {}", filename, e.what()));}
 }
 
+TransitionSet & ReadingMachine::getTransitionSet()
+{
+  return classifier->getTransitionSet();
+}
+
+Strategy & ReadingMachine::getStrategy()
+{
+  return *strategy;
+}
+
diff --git a/reading_machine/src/Strategy.cpp b/reading_machine/src/Strategy.cpp
index 3b49cd4738d55eb05ae38c8dbc92757af28744f6..ca045f1db32bb5549da9b4a160d12901c1aaad31 100644
--- a/reading_machine/src/Strategy.cpp
+++ b/reading_machine/src/Strategy.cpp
@@ -16,6 +16,8 @@ Strategy::Strategy(const std::vector<std::string_view> & lines)
     {
       key = std::pair<std::string,std::string>(splited[0], "");
       value = splited[1];
+      if (defaultCycle.empty())
+        initialState = splited[0];
       defaultCycle.emplace_back(value);
     }
     else if (splited.size() == 3)
@@ -100,3 +102,8 @@ std::pair<std::string, int> Strategy::getMovementIncremental(const Config & c, c
   return {defaultCycle.back(), 1};
 }
 
+const std::string Strategy::getInitialState() const
+{
+  return initialState;
+}
+
diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp
index d8b9c8a1b62929f6138063fc3c47c017816b7249..46147d4264cc6f10ab4e89d42230e5d9bfcf23c6 100644
--- a/reading_machine/src/Transition.cpp
+++ b/reading_machine/src/Transition.cpp
@@ -61,3 +61,8 @@ void Transition::initWrite(std::string colName, std::string object, std::string
   };
 }
 
+const std::string & Transition::getName() const
+{
+  return name;
+}
+
diff --git a/reading_machine/src/TransitionSet.cpp b/reading_machine/src/TransitionSet.cpp
index 467ad42e659670e343a3a333fb53a751f56bf10e..a1a1f8904b1874230bde7c257f6f6ea36b4b2732 100644
--- a/reading_machine/src/TransitionSet.cpp
+++ b/reading_machine/src/TransitionSet.cpp
@@ -1,4 +1,5 @@
 #include "TransitionSet.hpp"
+#include <limits>
 
 TransitionSet::TransitionSet(const std::string & filename)
 {
@@ -23,14 +24,14 @@ TransitionSet::TransitionSet(const std::string & filename)
   std::fclose(file);
 }
 
-std::vector<std::pair<Transition &, int>> TransitionSet::getAppliableTransitionsCosts(const Config & c)
+std::vector<std::pair<Transition*, int>> TransitionSet::getAppliableTransitionsCosts(const Config & c)
 {
-  using Pair = std::pair<Transition &, int>;
+  using Pair = std::pair<Transition*, int>;
   std::vector<Pair> appliableTransitions;
 
-  for (auto & transition : transitions)
-    if (transition.appliable(c))
-      appliableTransitions.emplace_back(transition, transition.getCost(c));
+  for (unsigned int i = 0; i < transitions.size(); i++)
+    if (transitions[i].appliable(c))
+      appliableTransitions.emplace_back(&transitions[i], transitions[i].getCost(c));
 
   std::sort(appliableTransitions.begin(), appliableTransitions.end(), 
   [](const Pair & a, const Pair & b)
@@ -41,3 +42,28 @@ std::vector<std::pair<Transition &, int>> TransitionSet::getAppliableTransitions
   return appliableTransitions;
 }
 
+Transition * TransitionSet::getBestAppliableTransition(const Config & c)
+{
+  Transition * result = nullptr;
+  int bestCost = std::numeric_limits<int>::max();
+
+  for (unsigned int i = 0; i < transitions.size(); i++)
+  {
+    if (!transitions[i].appliable(c))
+      continue;
+
+    int cost = transitions[i].getCost(c);
+
+    if (cost == 0)
+      return &transitions[i];
+
+    if (cost < bestCost)
+    {
+      result = &transitions[i];
+      bestCost = cost;
+    }
+  }
+
+  return result;
+}
+