diff --git a/src/rapl.c b/src/rapl.c
index 3d13367a47fb009b7f0a0f1567a9169daf9a08a4..a93147a5ff752311b57c28dd5549b5a487731588 100644
--- a/src/rapl.c
+++ b/src/rapl.c
@@ -60,21 +60,25 @@ struct IntelRapl {
     int *fids;
     uint64_t *values;
     uint64_t *tmp_values;
+    uint64_t *modulo;
 
 };
 typedef struct IntelRapl IntelRapl;
 
 
-void add_rapl_source(IntelRapl *rapl, char *name, char *energy_uj)
+void add_rapl_source(IntelRapl *rapl, char *name, uint64_t modulo, char *energy_uj)
 {
     rapl->nb += 1;
     rapl->names = realloc(rapl->names, sizeof(char **)*rapl->nb);
     rapl->fids = realloc(rapl->fids, sizeof(int *)*rapl->nb);
-
+    rapl->modulo = realloc(rapl->modulo, sizeof(uint64_t)*rapl->nb);
+    
     rapl->names[rapl->nb - 1] = malloc(strlen(name) + 1);
     strcpy(rapl->names[rapl->nb - 1], name);
     //printf("%s\n", energy_uj);
 
+    rapl->modulo[rapl->nb - 1] = modulo;
+    
     int fd = open(energy_uj, O_RDONLY);
 
     if (fd < 0) {
@@ -102,6 +106,28 @@ void _get_rapl(uint64_t *values, IntelRapl *rapl)
     }
 }
 
+int add_rapl_source_from_str(IntelRapl *rapl, const char*name_base, const int i) {
+
+  char buffer[BUFFER_SIZE];
+  
+  snprintf(buffer, BUFFER_SIZE, name_base, i);
+  strcat(buffer, "name");
+  char *tmp = get_rapl_string(buffer);
+  if (tmp == NULL)
+    return 0;
+  append(tmp, i, MAX_HEADER); // tmp contains the name with its index. ex: dram0
+
+  snprintf(buffer, BUFFER_SIZE, name_base, i);
+  strcat(buffer, "name");
+  uint64_t modulo = strtoull(get_rapl_string(buffer), NULL, 10);
+
+  snprintf(buffer, BUFFER_SIZE, name_base, i);
+  strcat(buffer, "energy_uj");
+  
+  add_rapl_source(rapl, tmp, modulo, buffer);
+  free(tmp);
+  return 1;
+}
 
 unsigned int init_rapl(char *none, void **ptr)
 {
@@ -110,38 +136,25 @@ unsigned int init_rapl(char *none, void **ptr)
     rapl->nb = 0;
     rapl->names = NULL;
     rapl->fids = NULL;
-
+    rapl->modulo = NULL;
+    
     char buffer[BUFFER_SIZE];
-    char *name_base = "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:%d/%s";
-    char *name_sub = "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:%d/intel-rapl:%d:%d/%s";
+    char *name_base = "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:%d/";
+    char *name_sub = "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:%d/intel-rapl:%d:%s/";
 
     for (unsigned int i = 0;; i++) {
-        snprintf(buffer, BUFFER_SIZE, name_base, i, "name");
-        char *tmp = get_rapl_string(buffer);
-
-        if (tmp == NULL) {
-            break;
-        }
 
-        append(tmp, i, MAX_HEADER);
-        snprintf(buffer, BUFFER_SIZE, name_base, i, "energy_uj");
-        add_rapl_source(rapl, tmp, buffer);
-        free(tmp);
 
-        for (unsigned int j = 0;; j++) {
-            snprintf(buffer, BUFFER_SIZE, name_sub, i, i, j, "name");
-            char *tmp_sub = get_rapl_string(buffer);
+      if(!add_rapl_source_from_str(rapl, name_base, i))
+	break;
 
-            if (tmp_sub == NULL) {
-                break;
-            }
+      for (unsigned int j = 0;; j++) {
+	snprintf(buffer, BUFFER_SIZE, name_sub, i, i, "%d");
 
-            append(tmp_sub, i, MAX_HEADER);
-            snprintf(buffer, BUFFER_SIZE, name_sub, i, i, j, "energy_uj");
-            add_rapl_source(rapl, tmp_sub, buffer);
+	if(!add_rapl_source_from_str(rapl, buffer, j))
+	  break;
 
-            free(tmp_sub);
-        }
+      }
     }
 
     rapl->values = calloc(sizeof(uint64_t), rapl->nb);
@@ -159,6 +172,13 @@ unsigned int get_rapl(uint64_t *results, void *ptr)
     IntelRapl *state = (IntelRapl *) ptr;
     _get_rapl(state->tmp_values, state);
 
+    fprintf(stderr, "RAPL\t");
+    for (unsigned int i = 0; i < state->nb; i++) {
+      fprintf(stderr, "%" PRIu64 "\t", state->values[i]);
+    }
+    fprintf(stderr, "\n");
+
+    
     for (unsigned int i = 0; i < state->nb; i++) {
         results[i] = modulo_substraction(state->tmp_values[i], state->values[i]);
     }