diff --git a/transition_machine/src/Oracle.cpp b/transition_machine/src/Oracle.cpp
index 8838de4a121dd259c8b3b87bf2e21db66cd214a6..7d1b27f060321d174e7b29dc393fca7ec11a7fc3 100644
--- a/transition_machine/src/Oracle.cpp
+++ b/transition_machine/src/Oracle.cpp
@@ -245,6 +245,12 @@ void Oracle::createDatabase()
 
     if (action == "ADDCHARTOWORD" && currentWordRef.size() > currentWordHyp.size())
     {
+      if (c.hasTape("ID") && c.getTape("ID").getRef(0).empty())
+      {
+        fprintf(stderr, "ERROR (%s) : ID.getRef(0) is empty. Aborting.\n", ERRINFO);
+        exit(1);
+      }
+
       if (c.hasTape("ID") && util::split(c.getTape("ID").getRef(0), '-').size() > 1)
         return 1;
 
@@ -968,17 +974,28 @@ void Oracle::createDatabase()
     auto & eos = c.getTape(ProgramParameters::sequenceDelimiterTape);
 
     int head = c.getHead();
+    int stackHead = c.stackEmpty() ? 0 : c.stackTop();
 
     if (head >= eos.size())
       return action == "EOS" ? 0 : 1;
 
+    if (ids.getRef(0).empty())
+    {
+      fprintf(stderr, "ERROR (%s) : ID.getRef(0) is empty. Aborting.\n", ERRINFO);
+      exit(1);
+    }
+    if (ids.getRef(stackHead-head).empty())
+    {
+      fprintf(stderr, "ERROR (%s) : ID.getRef(stackHead-head) is empty. Aborting.\n", ERRINFO);
+      exit(1);
+    }
+
     bool headIsMultiword = util::split(ids.getRef(0), '-').size() > 1;
     bool headIsEmptyNode = util::split(ids.getRef(0), '.').size() > 1;
     int headGov = -1;
     try {headGov = head + std::stoi(govs.getRef(0));}
     catch (std::exception &) {headGov = -1;}
 
-    int stackHead = c.stackEmpty() ? 0 : c.stackTop();
     bool stackHeadIsMultiword = util::split(ids.getRef(stackHead-head), '-').size() > 1;
     bool stackHeadIsEmptyNode = util::split(ids.getRef(stackHead-head), '.').size() > 1;
     int stackGov = -1;