diff --git a/transition_machine/src/Config.cpp b/transition_machine/src/Config.cpp
index ca4a2cbbaa3e824b4e20fd6c7c468181a0f8fe29..42c993b649fa9e9119e7bc8326934e4c6737caaf 100644
--- a/transition_machine/src/Config.cpp
+++ b/transition_machine/src/Config.cpp
@@ -735,7 +735,10 @@ bool Config::Tape::headIsAtEnd() const
   if (head >= ref.getLastIndex())
     return true;
 
-  return !getHyp(0).empty() && getHyp(1).empty();
+  if (ProgramParameters::rawInput)
+    return !getHyp(0).empty() && getHyp(1).empty();
+
+  return !getRef(0).empty() && getRef(1).empty();
 }
 
 int Config::Tape::size()
diff --git a/transition_machine/src/Oracle.cpp b/transition_machine/src/Oracle.cpp
index 2a2a945c2ea1e159ccad1bb436dd98fe7a703226..508fc3d907501aad094f9596267ebdc0b53ab21f 100644
--- a/transition_machine/src/Oracle.cpp
+++ b/transition_machine/src/Oracle.cpp
@@ -414,6 +414,9 @@ void Oracle::createDatabase()
       movement = 1;
     }
 
+    if (c.isFinal())
+      return std::string("");
+
     return "MOVE " + newState + " " + std::to_string(movement);
   },
   [](Config &, Oracle *, const std::string &)
@@ -451,6 +454,8 @@ void Oracle::createDatabase()
     {
       newState = "lemmatizer_lookup";
       movement = 1;
+      if (c.isFinal())
+        return std::string("");
     }
 
     return "MOVE " + newState + " " + std::to_string(movement);
@@ -591,6 +596,9 @@ void Oracle::createDatabase()
     {
       newState = "parser";
       movement = 1;
+
+      if (c.isFinal())
+        return std::string("");
     }
     else if (previousState == "error_parser")
     {
@@ -654,6 +662,8 @@ void Oracle::createDatabase()
     {
       newState = "tagger";
       movement = 1;
+      if (c.isFinal())
+        return std::string("");
     }
     else
       newState = "unknown("+std::string(ERRINFO)+")("+previousState+")("+previousAction+")";