diff --git a/mojitos.c b/mojitos.c
index 3c34a0f35afa6ccb5f97c08de0f6a1a3b654a6e6..0e9d065138cc8119ae03b2ea6825dd7a17f53b1b 100644
--- a/mojitos.c
+++ b/mojitos.c
@@ -217,7 +217,7 @@ int main(int argc, char **argv) {
   if(rapl_mode==0) {
     rapl = init_rapl(nbzones, rapl_zones);
     // prepare rapl data stores
-    rapl_size = rapl->nbpackages*rapl->nbzones * sizeof(uint64_t);
+    rapl_size = rapl->nb * sizeof(uint64_t);
     //rapl_values = malloc(rapl_size);
     rapl_values = calloc(sizeof(char), rapl_size);
     //tmp_rapl_values = malloc(rapl_size);
@@ -250,8 +250,8 @@ int main(int argc, char **argv) {
     fprintf(output, "irxp irxb itxp itxb ");
 
   if(rapl_mode==0)
-    for (int r=0; r<rapl->nbpackages*rapl->nbzones; r++)
-      fprintf(output, "%s%u ", rapl->names[r], (unsigned int)r/rapl->nbzones);
+    for (int r=0; r<rapl->nb; r++)
+      fprintf(output, "%s ", rapl->names[r]);
 
   if(load_mode==0)
     fprintf(output, "user nice system idle iowait irq softirq steal guest guest_nice ");
@@ -322,7 +322,7 @@ int main(int argc, char **argv) {
       for(int i=0; i<4; i++)
 	fprintf(output, "%lld ", tmp_infiniband_values[i]-infiniband_values[i]);
     if(rapl_mode==0)
-      for (int r=0; r<rapl->nbpackages*rapl->nbzones; r++)
+      for (int r=0; r<rapl->nb; r++)
 	fprintf(output, "%ld ", tmp_rapl_values[r]-rapl_values[r]);
     if(load_mode==0)
       for(int i=0; i<10; i++)
@@ -359,6 +359,9 @@ int main(int argc, char **argv) {
   if(perf_mode==0){
     clean_counters(fd);
     free(counter_values);
+    free(perf_type);
+    free(perf_key);
+    free(perf_indexes);
   }
 }
 
diff --git a/rapl.c b/rapl.c
index da171da9d1b1e9a2e99d28f53c2120d3dbc14335..f24808bc67f78cc6d6257bb4aad9db297f5cf3d1 100644
--- a/rapl.c
+++ b/rapl.c
@@ -28,30 +28,47 @@
 _rapl_t* init_rapl(const uint32_t nb_zones, const int *rapl_zones) {
   // get number of processor sockets
   _rapl_t* rapl = malloc(sizeof(struct _rapl_t));
-  rapl->nbzones = nb_zones;
-  rapl->zones = rapl_zones;
+  rapl->nb = 0;
+  rapl->packages = NULL;
+  rapl->zones = NULL;
 
-  rapl->nbpackages = powercap_rapl_get_num_packages();
-  if (rapl->nbpackages == 0) {
+  rapl->nb_pkgs = powercap_rapl_get_num_packages();
+  if (rapl->nb_pkgs == 0) {
     perror("no packages found (maybe the kernel module isn't loaded?)");
     exit(-1);
   }
-  rapl->pkgs = malloc(rapl->nbpackages * sizeof(powercap_rapl_pkg));  
-  for (int package = 0; package < rapl->nbpackages; package++)
+  rapl->pkgs = malloc(rapl->nb_pkgs * sizeof(powercap_rapl_pkg));  
+  for (int package = 0; package < rapl->nb_pkgs; package++)
     if (powercap_rapl_init(package, &rapl->pkgs[package], 0)) {
       perror("powercap_rapl_init, check access (root needed ?)");
       exit(-1);
     }
 
-  rapl->names = malloc(sizeof(char*) * (rapl->nbzones) * (rapl->nbpackages) );
+  printf("%d %d\n\n", nb_zones, rapl->nb_pkgs);
+  rapl->names = NULL;
+    
   char _name[MAX_LEN_NAME+1];
+  char _name2[MAX_LEN_NAME+10];
 
-  for (int package = 0; package < rapl->nbpackages; package++) {
-    for(int zone=0; zone<rapl->nbzones; zone++) {
-      powercap_rapl_get_name(&rapl->pkgs[package], rapl_zones[zone],
+  for (unsigned int package = 0; package < rapl->nb_pkgs; package++) {
+    for(unsigned int zone=0; zone < nb_zones; zone++) {
+      int a=powercap_rapl_get_name(&rapl->pkgs[package], rapl_zones[zone],
 			     _name, MAX_LEN_NAME);
-      rapl->names[package*rapl->nbzones+zone] = malloc(sizeof(char) * (strlen(_name)+1));
-      strcpy(rapl->names[package*rapl->nbzones+zone], _name);
+      if (a>0) {
+
+	sprintf(_name2, "%s%u ", _name, package);
+
+	rapl->nb++;
+	rapl->names = realloc(rapl->names, sizeof(char*)*rapl->nb);
+	rapl->names[rapl->nb-1] = malloc(sizeof(char) * (strlen(_name2)+1));
+	rapl->zones = realloc(rapl->zones, sizeof(uint32_t)*rapl->nb);
+	rapl->packages = realloc(rapl->packages, sizeof(uint32_t)*rapl->nb);
+	
+	strcpy(rapl->names[rapl->nb-1], _name2);
+	rapl->zones[rapl->nb-1] = zone;
+	rapl->packages[rapl->nb-1] = package;
+      }
+      printf("%d %d %d %s\n\n", a, package, zone, _name2);
     }
   }
   return rapl;
@@ -61,21 +78,23 @@ _rapl_t* init_rapl(const uint32_t nb_zones, const int *rapl_zones) {
 
 // values [zone + package *nbzones] microjoules
 void get_rapl(uint64_t *values, _rapl_t* rapl) {
-  for (int package = 0; package < rapl->nbpackages; package++) {
-    for(int zone=0; zone<rapl->nbzones; zone++) {
-      powercap_rapl_get_energy_uj(&rapl->pkgs[package], rapl->zones[zone], &values[package*rapl->nbzones+zone]);
-    }
+  for (int i = 0; i < rapl->nb; i++) {
+    powercap_rapl_get_energy_uj(&rapl->pkgs[rapl->packages[i]],
+				rapl->zones[i],
+				&values[i]);
   }
 }
 
 void clean_rapl(_rapl_t* rapl) {
-  for (int package = 0; package < rapl->nbpackages; package++) {
+  for (int package = 0; package < rapl->nb_pkgs; package++)
     if (powercap_rapl_destroy(&rapl->pkgs[package]))
       perror("powercap_rapl_destroy");
-    for (int zone=0; zone<rapl->nbzones; zone++) 
-      free(rapl->names[package*rapl->nbzones+zone]);
-  }
+  for (int elem=0; elem<rapl->nb; elem++) 
+      free(rapl->names[elem]);
+  
   free(rapl->names);
   free(rapl->pkgs);
+  free(rapl->zones);
+  free(rapl->packages);
   free(rapl);
 }
diff --git a/rapl.h b/rapl.h
index 1af8cf408f25c92d65538f26c423a10da6367c1d..48abcb0a3490956ac703f36e1b239fd18fbc83bd 100644
--- a/rapl.h
+++ b/rapl.h
@@ -22,14 +22,15 @@
 
 struct _rapl_t {
   powercap_rapl_pkg* pkgs;
-  uint32_t nbpackages;
-  uint32_t nbzones;
+  uint32_t nb_pkgs;
+  
+  uint32_t nb;
+
   char **names;
-  const int* zones;
+  uint32_t* zones;
+  uint32_t* packages;
 };
 
-typedef struct _rapl_t* rapl_t;
-
 typedef struct _rapl_t _rapl_t;
 
 _rapl_t* init_rapl(const uint32_t nb_zones, const int *rapl_zones);