diff --git a/transition_machine/src/Oracle.cpp b/transition_machine/src/Oracle.cpp
index b27b2e2a15638c9c71ece036e48cb70741664c1a..b660cbc62734cc9f51d33c72728ff7556ce28677 100644
--- a/transition_machine/src/Oracle.cpp
+++ b/transition_machine/src/Oracle.cpp
@@ -191,6 +191,37 @@ void Oracle::createDatabase()
     return 0;
   })));
 
+  str2oracle.emplace("error_parser", std::unique_ptr<Oracle>(new Oracle(
+  [](Oracle * oracle)
+  {
+    File file(oracle->filename, "r");
+    FILE * fd = file.getDescriptor();
+    char b1[1024];
+
+    while (fscanf(fd, "%[^\n]\n", b1) == 1)
+      oracle->data[b1] = b1;
+  },
+  [](Config & c, Oracle * oracle)
+  {
+    if (c.getCurrentStateHistory().size() >= 2 && (c.getCurrentStateHistory().top() == "BACK" || c.getCurrentStateHistory().getElem(1) == "BACK"))
+      return std::string("EPSILON");
+
+    if (c.getCurrentStateHistory().size() < 2)
+      return std::string("EPSILON");
+
+    if (c.hashHistory.contains(c.computeHash()))
+      return std::string("EPSILON");
+
+    if (oracle->data.count("systematic"))
+      return std::string("BACK 1");
+
+    return std::string("EPSILON");
+  },
+  [](Config &, Oracle *, const std::string &)
+  {
+    return 0;
+  })));
+
   str2oracle.emplace("tagger", std::unique_ptr<Oracle>(new Oracle(
   [](Oracle *)
   {