diff --git a/reading_machine/include/Action.hpp b/reading_machine/include/Action.hpp
index 7900c7bbeafcba5940ccc5c4d620c88321818e40..17e71149d37626029548251b7f3f0ae3c69c0d03 100644
--- a/reading_machine/include/Action.hpp
+++ b/reading_machine/include/Action.hpp
@@ -58,11 +58,12 @@ class Action
   static Action setRoot();
   static Action updateIds();
   static Action endWord();
+  static Action assertIdIsEmpty();
   static Action attach(Object governorObject, int governorIndex, Object dependentObject, int dependentIndex);
   static Action addCurCharToCurWord();
   static Action ignoreCurrentCharacter();
   static Action consumeCharacterIndex(std::string consumed);
-  static Action setMultiwordId(int multiwordSize);
+  static Action setMultiwordIds(int multiwordSize);
 };
 
 #endif
diff --git a/reading_machine/src/Action.cpp b/reading_machine/src/Action.cpp
index 5c68d392a440e03ff55949c4c1d991ac325d3189..dbe4c12364af3d444c7b7b4eeef23240b5e24393 100644
--- a/reading_machine/src/Action.cpp
+++ b/reading_machine/src/Action.cpp
@@ -48,16 +48,20 @@ Action Action::moveWordIndex(int movement)
   return {Type::MoveWord, apply, undo, appliable};
 }
 
-Action Action::setMultiwordId(int multiwordSize)
+Action Action::setMultiwordIds(int multiwordSize)
 {
   auto apply = [multiwordSize](Config & config, Action & a)
   {
     addHypothesisRelative(Config::idColName, Object::Buffer, 0, fmt::format("{}-{}", config.getCurrentWordId()+1, config.getCurrentWordId()+multiwordSize)).apply(config, a);
+    for (int i = 0; i < multiwordSize; i++)
+      addHypothesisRelative(Config::idColName, Object::Buffer, i+1, fmt::format("{}", config.getCurrentWordId()+1+i)).apply(config, a);
   };
 
-  auto undo = [](Config & config, Action &)
+  auto undo = [multiwordSize](Config & config, Action &)
   {
     config.getLastNotEmpty(Config::idColName, config.getWordIndex()) = "";
+    for (int i = 0; i < multiwordSize; i++)
+      config.getLastNotEmpty(Config::idColName, config.getWordIndex()+1+i) = "";
   };
 
   auto appliable = [](const Config &, const Action &)
@@ -366,6 +370,24 @@ Action Action::ignoreCurrentCharacter()
   return {Type::MoveChar, apply, undo, appliable}; 
 }
 
+Action Action::assertIdIsEmpty()
+{
+  auto apply = [](Config &, Action &)
+  {
+  };
+
+  auto undo = [](Config &, Action &)
+  {
+  };
+
+  auto appliable = [](const Config & config, const Action &)
+  {
+    return util::isEmpty(config.getAsFeature(Config::idColName, config.getWordIndex()));
+  };
+
+  return {Type::Check, apply, undo, appliable}; 
+}
+
 Action Action::addCurCharToCurWord()
 {
   auto apply = [](Config & config, Action & a)
diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp
index 61681fcb4f4aed1a6d7a1d74d3406225dc6ff05f..11ad8e990054290957e1c98175e6a808c9ffd19a 100644
--- a/reading_machine/src/Transition.cpp
+++ b/reading_machine/src/Transition.cpp
@@ -164,6 +164,7 @@ void Transition::initEndWord()
 
 void Transition::initAddCharToWord()
 {
+  sequence.emplace_back(Action::assertIdIsEmpty());
   sequence.emplace_back(Action::addLinesIfNeeded(0));
   sequence.emplace_back(Action::addCurCharToCurWord());
   sequence.emplace_back(Action::moveCharacterIndex(1));
@@ -190,11 +191,12 @@ void Transition::initAddCharToWord()
 void Transition::initSplitWord(std::vector<std::string> words)
 {
   auto & consumedWord = words[0];
+  sequence.emplace_back(Action::assertIdIsEmpty());
   sequence.emplace_back(Action::addLinesIfNeeded(words.size()));
   sequence.emplace_back(Action::consumeCharacterIndex(consumedWord));
   for (unsigned int i = 0; i < words.size(); i++)
     sequence.emplace_back(Action::addHypothesisRelative("FORM", Action::Object::Buffer, i, words[i]));
-  sequence.emplace_back(Action::setMultiwordId(words.size()-1));
+  sequence.emplace_back(Action::setMultiwordIds(words.size()-1));
 
   cost = [words](const Config & config)
   {