diff --git a/maca_common/include/word.h b/maca_common/include/word.h
index 00e78085174f63911bb8f673e39ca9b5ca22e3af..b2fe6cfbb06da3175732b2116d73729b7dafd39f 100644
--- a/maca_common/include/word.h
+++ b/maca_common/include/word.h
@@ -52,7 +52,7 @@
 #define word_set_cpos(w, val)  (w)->wf_array[MCD_WF_CPOS] = (val)
 #define word_set_pos(w, val)   (w)->wf_array[MCD_WF_POS] = (val)
 #define word_set_feats(w, val) (w)->wf_array[MCD_WF_FEATS] = (val)
-#define word_set_gov(w, val)   (w)->wf_array[MCD_WF_GOV] = (val)
+#define word_set_gov(w, val)   ((w)->wf_array[MCD_WF_GOV] = (val))
 #define word_set_label(w, val) (w)->wf_array[MCD_WF_LABEL] = (val)
 #define word_set_stag(w, val)  (w)->wf_array[MCD_WF_STAG] = (val)
 #define word_set_sent_seg(w, val)   (w)->wf_array[MCD_WF_SENT_SEG] = (val)
diff --git a/maca_trans_parser/src/movements.c b/maca_trans_parser/src/movements.c
index a10e62b50be5e1d462689e29f67c993d2c65a902..64236b990016bcbe708d61b7bfc3ba8a7a490617 100644
--- a/maca_trans_parser/src/movements.c
+++ b/maca_trans_parser/src/movements.c
@@ -70,6 +70,7 @@ int movement_left_arc_undo(config *c)
 int movement_right_arc(config *c, int movement_code, int label)
 {
   if(stack_is_empty(config_get_stack(c))) return 0;
+  if(word_buffer_end(config_get_buffer(c))) return 0;
   
   word *gov = stack_top(config_get_stack(c));
   word *dep = word_buffer_b0(config_get_buffer(c));
@@ -140,8 +141,8 @@ int movement_reduce_undo(config *c)
 
 int movement_root(config *c, int movement_code, int root_code)
 {
+  if(stack_is_empty(config_get_stack(c))) return 0;
   word *s0 = stack_top(config_get_stack(c));
-  if(s0 == NULL) return 0;
   word_set_gov(s0, 0);
   word_set_label(s0, root_code);
   s0->is_root = 1;
diff --git a/maca_trans_parser/src/simple_decoder_parser_arc_eager.c b/maca_trans_parser/src/simple_decoder_parser_arc_eager.c
index 42fee6d5e41f381167f99a2585ad7673f5cde6ad..77fb88b89d8959f68864817d91535c99fb3428fd 100644
--- a/maca_trans_parser/src/simple_decoder_parser_arc_eager.c
+++ b/maca_trans_parser/src/simple_decoder_parser_arc_eager.c
@@ -60,10 +60,24 @@ void simple_decoder_parser_arc_eager(context *ctx)
     mvt_type = movement_parser_type(mvt_code);
     mvt_label = movement_parser_label(mvt_code);
     
+    if(ctx->debug_mode){
+      fprintf(stdout, "***********************************\n");
+      config_print(stdout, c);      
+
+      vcode *vcode_array = feature_table_get_vcode_array(fv, ft);
+
+      for(int i=0; i < 5; i++){
+	printf("%d\t", i);
+	movement_parser_print(stdout, vcode_array[i].class_code, ctx->dico_labels);
+	printf("\t%.4f\n", vcode_array[i].score);
+      }
+      free(vcode_array);
+    }
+    
     if(ctx->trace_mode){
       index = word_get_index(word_buffer_b0(config_get_buffer(c)));
       fprintf(stdout, "%d\t", index);
-
+      
       stack_print(stdout, c->st);
       fprintf(stdout, "\t");
       
@@ -102,6 +116,14 @@ void simple_decoder_parser_arc_eager(context *ctx)
       movement_parser_shift(c);
     }
   }
+
+  /* horrible hack */
+  if(stack_nbelem(config_get_stack(c)) && (stack_top(config_get_stack(c)) == NULL))
+    stack_pop(config_get_stack(c));
+  
+  while(!stack_is_empty(config_get_stack(c)) && (stack_top(config_get_stack(c)) != NULL))
+    movement_parser_root(c, root_label);
+  /* end of horrible hack */
   
   if(!ctx->trace_mode)
     print_word_buffer(c, ctx->dico_labels);