diff --git a/transition_machine/src/Action.cpp b/transition_machine/src/Action.cpp
index 1f838e55a48a12e1647d9f7520d9361d24a6c631..32dcce80e4450105a4224e0105c9a64334f1235c 100644
--- a/transition_machine/src/Action.cpp
+++ b/transition_machine/src/Action.cpp
@@ -1,6 +1,7 @@
 #include "Action.hpp"
 #include "ActionBank.hpp"
 #include "util.hpp"
+#include "ProgramParameters.hpp"
 
 void Action::apply(Config & config)
 {
@@ -46,6 +47,10 @@ void Action::undoOnlyStack(Config & config)
 
     sequence[i].undo(config, sequence[i]);
   }
+
+  if (ProgramParameters::debug)
+    fprintf(stderr, "Undoing action <%s>, history size = %d\n", name.c_str(), config.getStateHistory(stateName).size());
+  config.getStateHistory(stateName).pop();
 }
 
 Action::Action(const std::string & name)
diff --git a/transition_machine/src/Oracle.cpp b/transition_machine/src/Oracle.cpp
index b660cbc62734cc9f51d33c72728ff7556ce28677..a208ddab6c4e44b3780e47d8afeeae4c816d9952 100644
--- a/transition_machine/src/Oracle.cpp
+++ b/transition_machine/src/Oracle.cpp
@@ -102,21 +102,34 @@ void Oracle::createDatabase()
     char b1[1024];
 
     while (fscanf(fd, "%[^\n]\n", b1) == 1)
-      oracle->data[b1] = b1;
+    {
+      auto line = split(b1);
+      if (line.size() == 2)
+        oracle->data[line[0]] = line[1];
+      else
+      {
+        fprintf(stderr, "ERROR (%s) : Invalid line \'%s\'. Aborting.\n", ERRINFO, b1);
+        exit(1);
+      }
+    }
   },
   [](Config & c, Oracle * oracle)
   {
-    if (c.getCurrentStateHistory().size() >= 2 && (c.getCurrentStateHistory().top() == "BACK" || c.getCurrentStateHistory().getElem(1) == "BACK"))
-      return std::string("EPSILON");
+    int stateHistorySize = c.getStateHistory("tagger").size();
 
-    if (c.getCurrentStateHistory().size() < 2)
+    if (c.getCurrentStateHistory().size() >= 2 && (c.getCurrentStateHistory().top() == "BACK" || c.getCurrentStateHistory().getElem(1) == "BACK"))
       return std::string("EPSILON");
 
     if (c.hashHistory.contains(c.computeHash()))
       return std::string("EPSILON");
 
     if (oracle->data.count("systematic"))
-      return std::string("BACK 1");
+    {
+      if (stateHistorySize > std::stoi(oracle->data["systematic"]))
+        return std::string("BACK " + oracle->data["systematic"]);
+
+      return std::string("EPSILON");
+    }
 
     auto & pos = c.getTape("POS");
 
@@ -147,21 +160,34 @@ void Oracle::createDatabase()
     char b1[1024];
 
     while (fscanf(fd, "%[^\n]\n", b1) == 1)
-      oracle->data[b1] = b1;
+    {
+      auto line = split(b1);
+      if (line.size() == 2)
+        oracle->data[line[0]] = line[1];
+      else
+      {
+        fprintf(stderr, "ERROR (%s) : Invalid line \'%s\'. Aborting.\n", ERRINFO, b1);
+        exit(1);
+      }
+    }
   },
   [](Config & c, Oracle * oracle)
   {
-    if (c.getCurrentStateHistory().size() >= 2 && (c.getCurrentStateHistory().top() == "BACK" || c.getCurrentStateHistory().getElem(1) == "BACK"))
-      return std::string("EPSILON");
+    int stateHistorySize = c.getStateHistory("morpho").size();
 
-    if (c.getCurrentStateHistory().size() < 2)
+    if (c.getCurrentStateHistory().size() >= 2 && (c.getCurrentStateHistory().top() == "BACK" || c.getCurrentStateHistory().getElem(1) == "BACK"))
       return std::string("EPSILON");
 
     if (c.hashHistory.contains(c.computeHash()))
       return std::string("EPSILON");
 
     if (oracle->data.count("systematic"))
-      return std::string("BACK 1");
+    {
+      if (stateHistorySize > std::stoi(oracle->data["systematic"]))
+        return std::string("BACK " + oracle->data["systematic"]);
+
+      return std::string("EPSILON");
+    }
 
     auto & morpho = c.getTape("MORPHO");
 
@@ -199,21 +225,34 @@ void Oracle::createDatabase()
     char b1[1024];
 
     while (fscanf(fd, "%[^\n]\n", b1) == 1)
-      oracle->data[b1] = b1;
+    {
+      auto line = split(b1);
+      if (line.size() == 2)
+        oracle->data[line[0]] = line[1];
+      else
+      {
+        fprintf(stderr, "ERROR (%s) : Invalid line \'%s\'. Aborting.\n", ERRINFO, b1);
+        exit(1);
+      }
+    }
   },
   [](Config & c, Oracle * oracle)
   {
-    if (c.getCurrentStateHistory().size() >= 2 && (c.getCurrentStateHistory().top() == "BACK" || c.getCurrentStateHistory().getElem(1) == "BACK"))
-      return std::string("EPSILON");
+    int stateHistorySize = c.getStateHistory("parser").size();
 
-    if (c.getCurrentStateHistory().size() < 2)
+    if (c.getCurrentStateHistory().size() >= 2 && (c.getCurrentStateHistory().top() == "BACK" || c.getCurrentStateHistory().getElem(1) == "BACK"))
       return std::string("EPSILON");
 
     if (c.hashHistory.contains(c.computeHash()))
       return std::string("EPSILON");
 
     if (oracle->data.count("systematic"))
-      return std::string("BACK 1");
+    {
+      if (stateHistorySize > std::stoi(oracle->data["systematic"]))
+        return std::string("BACK " + oracle->data["systematic"]);
+
+      return std::string("EPSILON");
+    }
 
     return std::string("EPSILON");
   },