diff --git a/reading_machine/include/Transition.hpp b/reading_machine/include/Transition.hpp
index c4c6e272195788e3f00ba37b2aebced5f8cb813f..c3a4589170208ed897b1eebca731c74edf399dd1 100644
--- a/reading_machine/include/Transition.hpp
+++ b/reading_machine/include/Transition.hpp
@@ -10,6 +10,7 @@ class Transition
   private :
 
   std::string name;
+  std::string state;
   std::vector<Action> sequence;
   std::function<int(const Config & config)> cost;
 
diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp
index ce3cb811d23ebec4875c08cdca1c5f654a30d8a3..f18450c0a0d644fc07402461dcc04d9fd9d7f617 100644
--- a/reading_machine/src/Transition.cpp
+++ b/reading_machine/src/Transition.cpp
@@ -3,8 +3,7 @@
 
 Transition::Transition(const std::string & name)
 {
-  this->name = name;
-
+  std::regex nameRegex("(<(.+)> )?(.+)");
   std::regex writeRegex("WRITE ([bs])\\.(.+) (.+) (.+)");
   std::regex shiftRegex("SHIFT");
   std::regex reduceRegex("REDUCE");
@@ -14,23 +13,29 @@ Transition::Transition(const std::string & name)
 
   try
   {
-
-  if (util::doIfNameMatch(writeRegex, name, [this](auto sm){initWrite(sm[3], sm[1], sm[2], sm[4]);}))
+  if (!util::doIfNameMatch(nameRegex, name, [this, name](auto sm)
+        {
+          this->state = sm[2];
+          this->name = sm[3];
+        }))
+    util::myThrow("doesn't match nameRegex");
+
+  if (util::doIfNameMatch(writeRegex, this->name, [this](auto sm){initWrite(sm[3], sm[1], sm[2], sm[4]);}))
     return;
-  if (util::doIfNameMatch(shiftRegex, name, [this](auto){initShift();}))
+  if (util::doIfNameMatch(shiftRegex, this->name, [this](auto){initShift();}))
     return;
-  if (util::doIfNameMatch(reduceRegex, name, [this](auto){initReduce();}))
+  if (util::doIfNameMatch(reduceRegex, this->name, [this](auto){initReduce();}))
     return;
-  if (util::doIfNameMatch(leftRegex, name, [this](auto sm){initLeft(sm[1]);}))
+  if (util::doIfNameMatch(leftRegex, this->name, [this](auto sm){initLeft(sm[1]);}))
     return;
-  if (util::doIfNameMatch(rightRegex, name, [this](auto sm){initRight(sm[1]);}))
+  if (util::doIfNameMatch(rightRegex, this->name, [this](auto sm){initRight(sm[1]);}))
     return;
-  if (util::doIfNameMatch(eosRegex, name, [this](auto){initEOS();}))
+  if (util::doIfNameMatch(eosRegex, this->name, [this](auto){initEOS();}))
     return;
 
   throw std::invalid_argument("no match");
 
-  } catch (std::exception & e) {util::myThrow(fmt::format("Invalid name '{}' ({})", name, e.what()));}
+  } catch (std::exception & e) {util::myThrow(fmt::format("Invalid name '{}' ({})", this->name, e.what()));}
 
 }
 
@@ -42,6 +47,9 @@ void Transition::apply(Config & config)
 
 bool Transition::appliable(const Config & config) const
 {
+  if (!state.empty() && state != config.getState())
+    return false;
+
   for (const Action & action : sequence)
     if (!action.appliable(config, action))
       return false;