diff --git a/maca_common/src/dico_vec.c b/maca_common/src/dico_vec.c
index 9ac07166da2e8ade14b1777cba47f4073b1defec..a0642888d331831adb5ec84d8c5381235c0f1cfd 100644
--- a/maca_common/src/dico_vec.c
+++ b/maca_common/src/dico_vec.c
@@ -18,9 +18,12 @@ dico_vec *dico_vec_new(void)
 void dico_vec_free(dico_vec *dv)
 {
   if(dv){
-    if(dv->t)
-      free(dv->t);
-    free(dv);
+      if (dv->ht)
+	  hash_free(dv->ht);
+
+      if(dv->t)
+	  free(dv->t);
+      free(dv);
   }
 }
 
@@ -98,5 +101,6 @@ dico_vec *dico_vec_read(char *filename, float ratio)
   while(!feof(f)){
     dico_vec_add(dv, dico_read_fh(f, ratio));
   }
+  fclose(f);
   return dv;
 }
diff --git a/maca_common/src/form2pos.c b/maca_common/src/form2pos.c
index dccc016eeb197852c866e9a59adbaefde3b39b6b..b200c780e12371d4473561e2690c44fc481e6c5c 100644
--- a/maca_common/src/form2pos.c
+++ b/maca_common/src/form2pos.c
@@ -16,7 +16,8 @@ form2pos *form2pos_new(int nbelem, int pos_nb, char *pos_list)
   f2p->h_form2signature = hash_new(nbelem * 4);
   token = strtok(pos_list, "\t");
   do{
-    dico_add(f2p->d_pos, strdup(token));
+      //dico_add(f2p->d_pos, strdup(token));
+      dico_add(f2p->d_pos, token); // token is strdup'ed in dico_add()
   }while((token = strtok(NULL, "\t")));
   return f2p;
 }
@@ -83,6 +84,7 @@ form2pos *form2pos_read(char *filename)
     /* printf("form = %s signature = %s code = %d\n", form, signature, signature_code);   */
     hash_add(f2p->h_form2signature, strdup(form), dico_add(f2p->d_signature, signature));
   }
+  fclose(f);
   return f2p;
 }
 
diff --git a/maca_common/src/hash.c b/maca_common/src/hash.c
index 1a30c6f4ec30d5f8ae84bdafb2df7f6820cabee5..724bcceaa1211c2d0cc7bd969c6633df3c474fd5 100644
--- a/maca_common/src/hash.c
+++ b/maca_common/src/hash.c
@@ -39,6 +39,7 @@ void hash_free(hash *h)
   int i;
   for(i=0; i < h->size; i++)
     cell_free(h->array[i]);
+  free(h->array);
   free(h);
 }
 
diff --git a/maca_lemmatizer/src/context.c b/maca_lemmatizer/src/context.c
index 262a08cbc2233cd0f935b0648bf75d48f68a2470..2fc6f42b565539bbc5140232b83c3b4db040e751 100644
--- a/maca_lemmatizer/src/context.c
+++ b/maca_lemmatizer/src/context.c
@@ -156,8 +156,15 @@ void context_set_linguistic_resources_filenames(context *ctx)
 
   if(ctx->maca_data_path)
     strcat(absolute_path, ctx->maca_data_path);
-  else
-    strcat(absolute_path, getenv("MACAON_DIR"));
+  else {
+      char *e = getenv("MACAON_DIR");
+      if (e != NULL) {
+	  strcat(absolute_path, e);	  
+      } else {
+	  fprintf(stderr, "ATTENTION: the environment variable MACAON_DIR is not defined\n");
+      }
+  }
+
 	   
   strcat(absolute_path, "/");
   strcat(absolute_path, ctx->language);
diff --git a/maca_trans_parser/src/context.c b/maca_trans_parser/src/context.c
index 1b9704e1b1e97862cd0b80c00c753a8ccea3f37e..85acc249c706395b5bcd9a0512765990736c8f9e 100644
--- a/maca_trans_parser/src/context.c
+++ b/maca_trans_parser/src/context.c
@@ -22,6 +22,14 @@ void context_free(context *ctx)
   if(ctx->maca_data_path)          free(ctx->maca_data_path);
   if(ctx->language)                free(ctx->language);
   if(ctx->root_label)              free(ctx->root_label);
+  if(ctx->vocabs_filename)         free(ctx->vocabs_filename);
+  if(ctx->fplm_filename)           free(ctx->fplm_filename);
+
+  if (ctx->mcd_struct)
+      mcd_free(ctx->mcd_struct);
+
+  if (ctx->vocabs) 
+      dico_vec_free(ctx->vocabs);
 
   if(ctx->d_perceptron_features)
     dico_free(ctx->d_perceptron_features);
@@ -55,6 +63,7 @@ context *context_new(void)
   ctx->features_model_filename = NULL;
   ctx->vocabs_filename = NULL;  
   ctx->f2p_filename = NULL;  
+  ctx->fplm_filename = NULL;
 
   ctx->maca_data_path = NULL;  
   ctx->language = strdup("fr");
@@ -251,12 +260,14 @@ context *context_read_options(int argc, char *argv[])
 	ctx->vocabs_filename = strdup(optarg);
 	break;
       case 'L':
-	ctx->language = strdup(optarg);
+	if (ctx->language) free(ctx->language); // libérer le default (strdup("fr") )
+  	ctx->language = strdup(optarg);
 	break;
       case 'D':
 	ctx->maca_data_path = strdup(optarg);
 	break;
       case 'R':
+	if (ctx->root_label) free(ctx->root_label); // libérer le default (strdup("root") )
 	ctx->root_label = strdup(optarg);
 	break;
       case 'P':
diff --git a/maca_trans_parser/src/feat_desc.c b/maca_trans_parser/src/feat_desc.c
index ab7659702baab3f5a7372ed4fd8784b54cfe6523..7eb5c881b32f06ea79719a9c39578b593f5d29c9 100644
--- a/maca_trans_parser/src/feat_desc.c
+++ b/maca_trans_parser/src/feat_desc.c
@@ -6,18 +6,15 @@
 
 void simple_feat_desc_free(simple_feat_desc *sfd)
 {
-  /*  if(sfd->name)
-      free(sfd->name);
-  free(sfd);*/
+    if(sfd->name)
+	free(sfd->name);
+    free(sfd);
 }
 
 void feat_desc_free(feat_desc *fd)
 {
-  int i;
-  for(i=0; i < fd->nbelem; i++)
-    simple_feat_desc_free(fd->array[i]);
   free(fd->array);
-  /* free(fd); */
+  free(fd);
 }
 
 simple_feat_desc *simple_feat_desc_new(char *name, int type, feat_fct fct)
diff --git a/maca_trans_parser/src/feat_desc.h b/maca_trans_parser/src/feat_desc.h
index 13e0edb8df90368bbe309c04630880fdaf069649..e32390d1691f76dc3bb412bf01c1d3d5d1a26971 100644
--- a/maca_trans_parser/src/feat_desc.h
+++ b/maca_trans_parser/src/feat_desc.h
@@ -23,6 +23,7 @@ feat_desc *feat_desc_new(void);
 void feat_desc_free(feat_desc *fd);
 feat_desc *feat_desc_add(feat_desc *fd, simple_feat_desc *sfd);
 simple_feat_desc *simple_feat_desc_new(char *name, int type, feat_fct fct);
+void simple_feat_desc_free(simple_feat_desc *sfd);
 
 #endif
 
diff --git a/maca_trans_parser/src/feat_lib.c b/maca_trans_parser/src/feat_lib.c
index e76cc2ab249b0db71ad1d34553ab084f9400b857..a7471e2227069b4d16997eadb757520a770053f7 100644
--- a/maca_trans_parser/src/feat_lib.c
+++ b/maca_trans_parser/src/feat_lib.c
@@ -7,6 +7,7 @@ void feat_lib_add(feat_lib *fl, int feature_type, char *feature_name, feat_fct f
   int feature_nb = dico_add(fl->d_features, feature_name); 
   fl->array = (simple_feat_desc **)realloc(fl->array, (feature_nb + 1) * sizeof(simple_feat_desc *));
   fl->array[feature_nb] = simple_feat_desc_new(feature_name, feature_type, feature_fct);
+  fl->nbelem = feature_nb+1;
 }
 
 simple_feat_desc *feat_lib_get_simple_feat_desc(feat_lib *fl, char *feat_name)
@@ -28,13 +29,23 @@ feat_lib *feat_lib_new(void)
   return fl;
 }
 
+void feat_lib_free(feat_lib *fl) {
+
+    for(int i=0; i < fl->nbelem; ++i) {
+	simple_feat_desc_free(fl->array[i]);
+    }
+    dico_free(fl->d_features);
+    free(fl->array);
+    free(fl); // ne devrait pas etre en commentaire
+
+}
 
 feat_lib *feat_lib_build(void)
 {
   feat_lib *fl = feat_lib_new();
   
   feat_lib_add(fl, FEAT_TYPE_LABEL,  (char *)"s0sf", s0sf);
-  feat_lib_add(fl, FEAT_TYPE_INT       ,  (char *)"s0g", s0g);
+  feat_lib_add(fl, FEAT_TYPE_INT,    (char *)"s0g", s0g);
 
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"s0f", s0f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"s0l", s0l);
diff --git a/maca_trans_parser/src/feat_lib.h b/maca_trans_parser/src/feat_lib.h
index 1ec85ba6264a92e5cf6bf39ddf3984eb4625581b..b0af82298b2c1bf84be57da60a6d8bc9c5cf4f32 100644
--- a/maca_trans_parser/src/feat_lib.h
+++ b/maca_trans_parser/src/feat_lib.h
@@ -16,5 +16,5 @@ feat_lib *feat_lib_new(void);
 void feat_lib_add(feat_lib *fl, int feature_type, char *feature_name, feat_fct feature_fct);
 simple_feat_desc *feat_lib_get_simple_feat_desc(feat_lib *fl, char *feat_name);
 feat_lib *feat_lib_build(void);
-
+void feat_lib_free(feat_lib *fl);
 #endif
diff --git a/maca_trans_parser/src/feat_model.c b/maca_trans_parser/src/feat_model.c
index 1495776c839f5e2e2394a4ff0fa8be292efe5d86..9ee83b2a409cdce93e224528d7a7644680fe5fd9 100644
--- a/maca_trans_parser/src/feat_model.c
+++ b/maca_trans_parser/src/feat_model.c
@@ -44,7 +44,9 @@ void feat_model_free(feat_model *fm)
   int i;
   for(i=0; i < fm->nbelem; i++)
     feat_desc_free(fm->array[i]);
+  free(fm->array);
   free(fm->name);
+  feat_lib_free(fm->fl); 
   free(fm);
 }
 
@@ -55,10 +57,11 @@ feat_model *feat_model_read(char *filename, int verbose)
   int feature_number = 0;
   char buffer[1000]; /* ugly */
   char *feat_name;
-  feat_lib *fl = feat_lib_build();
+  //feat_lib *fl
+  fm->fl = feat_lib_build(); // must be preserved in feature_model to delete correctly features at the end
   simple_feat_desc *sfd;
   feat_desc *fd;
-  
+
   while(fgets(buffer, 1000, f)){
     if(feof(f)) break;
     if((buffer[0] == '\n') || (buffer[0] == '#')) continue;
@@ -67,7 +70,7 @@ feat_model *feat_model_read(char *filename, int verbose)
     feat_name = strtok(buffer, " \n");
     do{
       if(verbose) fprintf(stderr, "\t%s", feat_name);
-      sfd = feat_lib_get_simple_feat_desc(fl, feat_name);
+      sfd = feat_lib_get_simple_feat_desc(fm->fl, feat_name);
       if(sfd)
 	feat_desc_add(fd, sfd);
     }while((feat_name = strtok(NULL, " \n")));
diff --git a/maca_trans_parser/src/feat_model.h b/maca_trans_parser/src/feat_model.h
index d371d2551fe238156485e12d80a84b6062106562..4fa12d4a9f176e4fc3d4a56e4fb171d0feafefd4 100644
--- a/maca_trans_parser/src/feat_model.h
+++ b/maca_trans_parser/src/feat_model.h
@@ -2,6 +2,7 @@
 #define __FEAT_MODEL__
 
 #include "feat_desc.h"
+#include "feat_lib.h"
 
 typedef struct {
   char string[2048];
@@ -9,6 +10,7 @@ typedef struct {
   int nbelem;
   feat_desc **array;
   int dim;
+    feat_lib *fl; // stores all simple features 
 } feat_model;
 
 #include "config.h"
diff --git a/maca_trans_parser/src/maca_trans_interpreter.c b/maca_trans_parser/src/maca_trans_interpreter.c
index 281d3aacd703cc9eabd384ba2d95371da2027d74..a7dbc636d262aad2447ad699d40b37d71dede42b 100644
--- a/maca_trans_parser/src/maca_trans_interpreter.c
+++ b/maca_trans_parser/src/maca_trans_interpreter.c
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
   char *mcf_filename = NULL;
   FILE *mcf_file = NULL;
   int verbose = 0;
-  word_buffer *wb = NULL;
+  //word_buffer *wb = NULL;
   config *c = NULL;
   int mode = MODE_PARSER;
   
diff --git a/maca_trans_parser/src/maca_trans_lemmatizer.c b/maca_trans_parser/src/maca_trans_lemmatizer.c
index 6b71bc98401b1cf99efa3af21311af1bf374812e..1044ddad92280eae381b9a806357fc1508f78a02 100644
--- a/maca_trans_parser/src/maca_trans_lemmatizer.c
+++ b/maca_trans_parser/src/maca_trans_lemmatizer.c
@@ -41,7 +41,7 @@ void maca_lemmatizer_set_linguistic_resources_filenames(context *ctx)
   }
 }
 
-char **read_fplm_file(char *fplm_filename, hash *form_pos_ht, int debug_mode)
+char **read_fplm_file(char *fplm_filename, hash *form_pos_ht, int debug_mode, int *lemma_array_size)
 {
   char form[1000];
   char pos[1000];
@@ -49,12 +49,13 @@ char **read_fplm_file(char *fplm_filename, hash *form_pos_ht, int debug_mode)
   char morpho[1000];
   int num = 0;
   char **lemma_array;
-  int lemma_array_size = 10000;
+  //int lemma_array_size = 10000;
+  *lemma_array_size = 10000;
   char buffer[10000];
   int fields_nb;
   FILE *f= myfopen(fplm_filename, "r");
 
-  lemma_array = (char **)memalloc(lemma_array_size * sizeof(char *));
+  lemma_array = (char **)memalloc((*lemma_array_size) * sizeof(char *));
 
   while(fgets(buffer, 10000, f)){
     fields_nb = sscanf(buffer, "%[^\t]\t%s\t%[^\t]\t%s\n", form, pos, lemma, morpho);
@@ -69,11 +70,19 @@ char **read_fplm_file(char *fplm_filename, hash *form_pos_ht, int debug_mode)
     }
     strcat(form, "/");
     strcat(form, pos);
+    // TODO: memory leak: if form is already in the hash, it is not added and the memory
+    // allocated by strdup() is leaked
+    // solutions: hash_add does the strdup() if necessary (check else where !)
+    // or return code to indicate whether form has been added or not
     hash_add(form_pos_ht, strdup(form), num);
 
-    if(num >= lemma_array_size){
-      lemma_array_size = 2 * (lemma_array_size) + 1;
-      lemma_array = realloc(lemma_array, (lemma_array_size) * sizeof(char *));
+    if(num >= *lemma_array_size){
+      *lemma_array_size = 2 * (*lemma_array_size) + 1;
+      lemma_array = realloc(lemma_array, (*lemma_array_size) * sizeof(char *));
+      // initialize in order to be able to free correctly and the end
+      for(int i=num; i<*lemma_array_size; ++i) {
+	  lemma_array[i] = NULL;
+      }
     }
 
     /* if(lemma_array[num] == NULL) */
@@ -81,6 +90,7 @@ char **read_fplm_file(char *fplm_filename, hash *form_pos_ht, int debug_mode)
     num++;
   }
   /* fprintf(stderr, "%d entries loaded\n", num); */
+  fclose(f);
   return lemma_array;
 }
 
@@ -159,7 +169,8 @@ int main(int argc, char *argv[])
   maca_lemmatizer_check_options(ctx);
   maca_lemmatizer_set_linguistic_resources_filenames(ctx);
 
-  lemma_array = read_fplm_file(ctx->fplm_filename, form_pos_ht, ctx->debug_mode);
+  int lemma_array_size;
+  lemma_array = read_fplm_file(ctx->fplm_filename, form_pos_ht, ctx->debug_mode, &lemma_array_size);
   
   FILE *f = (ctx->input_filename)? myfopen(ctx->input_filename, "r") : stdin;
 
@@ -179,8 +190,19 @@ int main(int argc, char *argv[])
   
     word_buffer_move_right(c->bf);
   }
+
+  hash_free(form_pos_ht);
+
+  for(int i=0; i<lemma_array_size; ++i) {
+      if (lemma_array[i]) free(lemma_array[i]);
+  }
+  free(lemma_array);
+
+
   config_free(c); 
+  if (ctx->input_filename) fclose(f);
   context_free(ctx);
+
   return 0;
 }
 
diff --git a/maca_trans_parser/src/mvt_stack.c b/maca_trans_parser/src/mvt_stack.c
index 6f99a119ac3f662062cadf6545cbad3fdd0c33bd..6d3023d792f75b4be1bd3ae020477e8610431f1a 100644
--- a/maca_trans_parser/src/mvt_stack.c
+++ b/maca_trans_parser/src/mvt_stack.c
@@ -12,6 +12,9 @@ int i;
 
 void mvt_stack_free(mvt_stack *s)
 {
+    for(int i=0; i < s->size; ++i) {
+	  mvt_free(s->array[i]);
+  }
   free(s->array);
   free(s);
 }
diff --git a/maca_trans_parser/src/simple_decoder_tagger.c b/maca_trans_parser/src/simple_decoder_tagger.c
index 9a50f63a81f68ff20b4d9617c7516349069ac6be..747be8c17e391c14511afd14e21ffa04fced1d1a 100644
--- a/maca_trans_parser/src/simple_decoder_tagger.c
+++ b/maca_trans_parser/src/simple_decoder_tagger.c
@@ -133,5 +133,8 @@ void simple_decoder_tagger(context *ctx)
 
   }
   /* config_print(stdout, c);  */
-   config_free(c); 
+  feat_vec_free(fv);
+  feature_table_free(ft);
+  config_free(c); 
+  fclose(f);
 }