diff --git a/transition_machine/src/ActionBank.cpp b/transition_machine/src/ActionBank.cpp
index 5db8a67f5fdbe73e73c0cb749ff1846001759d77..8493896c5c7d396341f83883d4b2e6a0f4665c0f 100644
--- a/transition_machine/src/ActionBank.cpp
+++ b/transition_machine/src/ActionBank.cpp
@@ -351,7 +351,7 @@ Action::BasicAction ActionBank::pushHead()
     auto undo = [](Config & c, Action::BasicAction &)
       {c.stackPop();};
     auto appliable = [](Config & c, Action::BasicAction &)
-      {return !(c.stackSize() >= ProgramParameters::maxStackSize || (!c.stackEmpty() && c.stackTop() == c.getHead()));};
+      {return !(c.stackSize() >= ProgramParameters::maxStackSize || (!c.stackEmpty() && c.stackTop() == c.getHead()) || c.getHead() >= c.getTape(ProgramParameters::sequenceDelimiterTape).size());};
     Action::BasicAction basicAction =
       {Action::BasicAction::Type::Push, "", apply, undo, appliable};
 
@@ -663,6 +663,8 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na
       };
     auto appliable = [](Config & c, Action::BasicAction &)
       {
+        if (c.getHead() >= c.getTape(ProgramParameters::sequenceDelimiterTape).size())
+          return false;
         if (c.stackEmpty() || c.endOfTapes())
           return false;
         int b0 = c.getHead();
@@ -728,6 +730,8 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na
       };
     auto appliable = [](Config & c, Action::BasicAction &)
       {
+        if (c.getHead() >= c.getTape(ProgramParameters::sequenceDelimiterTape).size())
+          return false;
         if (c.stackEmpty())
           return false;
         if (util::split(c.getTape("ID").getRef(0), '-').size() > 1)
@@ -786,7 +790,7 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na
         };
       auto appliable = [](Config & c, Action::BasicAction &)
         {
-          return !c.isFinal() && !c.stackEmpty();
+          return !c.isFinal() && !c.stackEmpty() && c.getTape(ProgramParameters::sequenceDelimiterTape).getHyp(c.stackTop()-c.getHead()) != ProgramParameters::sequenceDelimiter;
         };
       Action::BasicAction basicAction =
         {Action::BasicAction::Type::Write, "", apply, undo, appliable};
diff --git a/transition_machine/src/Config.cpp b/transition_machine/src/Config.cpp
index 63f1c0c65d9f8acc0bd352eeba856e2443507c53..fbee3ee31fe0c21ff2520d18388c69e23b079882 100644
--- a/transition_machine/src/Config.cpp
+++ b/transition_machine/src/Config.cpp
@@ -943,6 +943,10 @@ void Config::updateIdsInSequence()
   auto & ids = getTape("ID");
   while (sentenceEnd >= 0 && eos.getHyp(sentenceEnd-getHead()) != ProgramParameters::sequenceDelimiter)
     sentenceEnd--;
+
+  while (sentenceEnd >= ids.size())
+    sentenceEnd--;
+
   int sentenceStart = std::max(0,sentenceEnd-1);
   while (sentenceStart >= 0 && eos.getHyp(sentenceStart-getHead()) != ProgramParameters::sequenceDelimiter)
     sentenceStart--;
@@ -964,6 +968,7 @@ void Config::updateIdsInSequence()
   for (int i = sentenceStart; i <= sentenceEnd; i++)
   {
     auto splited = util::split(ids.getRef(i-getHead()), '-');
+
     if (splited.size() == 1)
     {
       auto splited2 = util::split(ids.getRef(i-getHead()), '.');
diff --git a/transition_machine/src/Oracle.cpp b/transition_machine/src/Oracle.cpp
index 2438740cb5800347e328b9d82b1a1c9f43f13bdb..5ebb7694d36b242e2cf3315c0ddf6e6f45476bda 100644
--- a/transition_machine/src/Oracle.cpp
+++ b/transition_machine/src/Oracle.cpp
@@ -584,6 +584,8 @@ void Oracle::createDatabase()
       if (util::split(previousAction, ' ')[0] == "shift" || util::split(previousAction, ' ')[0] == "right")
       {
         newState = "signature";
+        if (c.endOfTapes())
+          newState = "parser";
         movement = 1;
       }
       else
@@ -772,6 +774,10 @@ void Oracle::createDatabase()
     auto & eos = c.getTape(ProgramParameters::sequenceDelimiterTape);
 
     int head = c.getHead();
+
+    if (head >= eos.size())
+      return action == "EOS" ? 0 : 1;
+
     bool headIsMultiword = util::split(ids.getRef(0), '-').size() > 1;
     bool headIsEmptyNode = util::split(ids.getRef(0), '.').size() > 1;
     int headGov = -1;