diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp
index 856475f833acc56b50aeab0bd45300d0442dcf3b..bf35c0a036159ae822dcdb5c8937b930aaebe67e 100644
--- a/reading_machine/src/Transition.cpp
+++ b/reading_machine/src/Transition.cpp
@@ -93,6 +93,9 @@ void Transition::initShift()
     int cost = 0;
     for (int i = 0; config.hasStack(i); ++i)
     {
+      if (!config.has(0, config.getStack(i), 0))
+        continue;
+
       auto stackIndex = config.getStack(i);
       auto stackId = config.getConst(Config::idColName, stackIndex, 0);
       auto stackGov = config.getConst(Config::headColName, stackIndex, 0);
@@ -184,6 +187,9 @@ void Transition::initRight(std::string label)
 
     for (int i = 1; config.hasStack(i); ++i)
     {
+      if (!config.has(0, config.getStack(i), 0))
+        continue;
+
       auto otherStackIndex = config.getStack(i);
       auto stackId = config.getConst(Config::idColName, otherStackIndex, 0);
       auto stackGov = config.getConst(Config::headColName, otherStackIndex, 0);
@@ -209,7 +215,10 @@ void Transition::initReduce()
 
   cost = [](const Config & config)
   {
-    if (!config.isToken(config.getWordIndex()))
+    if (!config.has(0, config.getStack(0), 0))
+      return 0;
+
+    if (!config.isToken(config.getStack(0)))
       return 0;
 
     int cost = 0;