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/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..760410cbd36e130e0f78bedf27268195c9a791e1 100644
--- a/maca_trans_parser/src/context.c
+++ b/maca_trans_parser/src/context.c
@@ -22,6 +22,13 @@ 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->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);
@@ -251,12 +258,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/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);
 }