diff --git a/infiniband.c b/infiniband.c
index 5c8655c41391da7feb49af46aca48619acf31e48..fb8928c4a6e68f6fce1badd09e4061d9f9c678a0 100644
--- a/infiniband.c
+++ b/infiniband.c
@@ -24,9 +24,19 @@
 
 #include <glob.h>
 
-int *init_infiniband(char* infi_path) {
+#include <stdint.h>
+
+struct network_t {
+  uint64_t values[4];
+  uint64_t tmp_values[4];
+  int sources[4];
+};
+unsigned int _get_network(uint64_t* results, int* sources);
+
+
+unsigned int init_infiniband(char* infi_path, void**ptr) {
   if(infi_path==NULL)
-    return NULL;
+    return 0;
 
   if(strcmp(infi_path,"X")==0) {
 
@@ -34,7 +44,7 @@ int *init_infiniband(char* infi_path) {
   
     glob("/sys/class/infiniband/*/ports/*/counters/", 0, NULL, &res);
     if(res.gl_pathc == 0)
-      return NULL;
+      return 0;
     infi_path = res.gl_pathv[0];
   }
   
@@ -42,14 +52,19 @@ int *init_infiniband(char* infi_path) {
 		       "%s/port_rcv_data",
 		       "%s/port_xmit_packets",
 		       "%s/port_xmit_data"};
-  int* sources = malloc(sizeof(int)*4);
+
+  struct network_t *state = malloc(sizeof(struct network_t));
+
   char buffer[1024];
   for(int i=0; i<4; i++) {
     sprintf(buffer, filenames[i], infi_path);
-    sources[i] = open(buffer, O_RDONLY);
+    state->sources[i] = open(buffer, O_RDONLY);
   }
+  
+  *ptr = (void*) state;
+  _get_network(state->values, state->sources);
 
-  return sources;
+  return 4;
 }
 
 /* void get_network(long long* results, char** sources) { */
diff --git a/mojitos.c b/mojitos.c
index 924c685cff1c2359a8efc35d7e84ec8d30ac4899..2b511f323f00666427824017930c0a4110c22921 100644
--- a/mojitos.c
+++ b/mojitos.c
@@ -146,8 +146,6 @@ int main(int argc, char **argv) {
   int total_time=1;
   int delta=0;
   int frequency=1;
-  char *dev = NULL;
-  char *infi_path = NULL;
   char **application = NULL;
 
   int rapl_mode = -1;
@@ -177,10 +175,10 @@ int main(int argc, char **argv) {
       }
       break;
     case 'd':
-      dev = argv[optind];
+      add_source(init_network, argv[optind], label_network, get_network, clean_network);
       break;
     case 'i':
-      infi_path = argv[optind];
+      add_source(init_infiniband, argv[optind], label_network, get_network, clean_network);
       break;
     case 'o':
       output = fopen(argv[optind],"wb");
@@ -210,22 +208,22 @@ int main(int argc, char **argv) {
     }
   
   
-  // Network initialization
-  int *network_sources = NULL;
-  if(dev != NULL)
-    network_sources = init_network(dev);
-  uint64_t network_values[4]={0,0,0,0};
-  uint64_t tmp_network_values[4]={0,0,0,0};
-  get_network(network_values, network_sources);
-
-  int * infiniband_sources = NULL;
-  if(infi_path != NULL)
-    infiniband_sources = init_infiniband(infi_path);
-  if(infiniband_sources == NULL)
-    infi_path = NULL;
-  uint64_t infiniband_values[4]={0,0,0,0};
-  uint64_t tmp_infiniband_values[4]={0,0,0,0};
-  get_network(infiniband_values, infiniband_sources);
+  /* // Network initialization */
+  /* int *network_sources = NULL; */
+  /* if(dev != NULL) */
+  /*   network_sources = init_network(dev); */
+  /* uint64_t network_values[4]={0,0,0,0}; */
+  /* uint64_t tmp_network_values[4]={0,0,0,0}; */
+  /* get_network(network_values, network_sources); */
+
+  /* int * infiniband_sources = NULL; */
+  /* if(infi_path != NULL) */
+  /*   infiniband_sources = init_infiniband(infi_path); */
+  /* if(infiniband_sources == NULL) */
+  /*   infi_path = NULL; */
+  /* uint64_t infiniband_values[4]={0,0,0,0}; */
+  /* uint64_t tmp_infiniband_values[4]={0,0,0,0}; */
+  /* get_network(infiniband_values, infiniband_sources); */
   
   // RAPL initialization
   _rapl_t* rapl=NULL;
@@ -265,10 +263,10 @@ int main(int argc, char **argv) {
   if(perf_mode==0)
     for(int i=0; i<nb_perf;i++)
       fprintf(output, "%s ", perf_static_info[perf_indexes[i]].name);
-  if(dev!=NULL)
-    fprintf(output, "rxp rxb txp txb ");
-  if(infi_path!=NULL)
-    fprintf(output, "irxp irxb itxp itxb ");
+  /* if(dev!=NULL) */
+  /*   fprintf(output, "rxp rxb txp txb "); */
+  /* if(infi_path!=NULL) */
+  /*   fprintf(output, "irxp irxb itxp itxb "); */
 
   if(rapl_mode==0)
     for (int r=0; r<nb_rapl; r++)
@@ -296,10 +294,10 @@ int main(int argc, char **argv) {
     // Get Data
     if(perf_mode==0)
       get_counters(fd, tmp_counter_values);
-    if(dev != NULL)
-      get_network(tmp_network_values, network_sources);
-    if(infi_path != NULL)
-      get_network(tmp_infiniband_values, infiniband_sources);
+    //    if(dev != NULL)
+    //  get_network(tmp_network_values, network_sources);
+    //if(infi_path != NULL)
+    //  get_network(tmp_infiniband_values, infiniband_sources);
 
     if(rapl_mode==0)
       get_rapl(tmp_rapl_values, rapl); 
@@ -343,12 +341,12 @@ int main(int argc, char **argv) {
     if(perf_mode==0)
       for(int i=0; i<nb_perf;i++) 
 	fprintf(output, "%" PRIu64 " ", tmp_counter_values[i]-counter_values[i]);
-    if(dev != NULL)
-      for(int i=0; i<4; i++)
-	fprintf(output, "%" PRIu64 " ", tmp_network_values[i]-network_values[i]);
-    if(infi_path != NULL)
-      for(int i=0; i<4; i++)
-	fprintf(output, "%" PRIu64 " ", tmp_infiniband_values[i]-infiniband_values[i]);
+    /* if(dev != NULL) */
+    /*   for(int i=0; i<4; i++) */
+    /* 	fprintf(output, "%" PRIu64 " ", tmp_network_values[i]-network_values[i]); */
+    /* if(infi_path != NULL) */
+    /*   for(int i=0; i<4; i++) */
+    /* 	fprintf(output, "%" PRIu64 " ", tmp_infiniband_values[i]-infiniband_values[i]); */
     if(rapl_mode==0)
       for (int r=0; r<nb_rapl; r++)
 	fprintf(output, "%" PRIu64 " ", tmp_rapl_values[r]-rapl_values[r]);
@@ -369,10 +367,10 @@ int main(int argc, char **argv) {
     if(rapl_mode==0)
       memcpy(rapl_values, tmp_rapl_values, nb_rapl*sizeof(uint64_t));
 
-    if(dev !=NULL)
-      memcpy(network_values, tmp_network_values, sizeof(network_values));
-    if(infi_path !=NULL)
-      memcpy(infiniband_values, tmp_infiniband_values, sizeof(infiniband_values));
+    /* if(dev !=NULL) */
+    /*   memcpy(network_values, tmp_network_values, sizeof(network_values)); */
+    /* if(infi_path !=NULL) */
+    /*   memcpy(infiniband_values, tmp_infiniband_values, sizeof(infiniband_values)); */
     clock_gettime(CLOCK_MONOTONIC, &ts);
     usleep(1000*1000/frequency-(ts.tv_nsec/1000)%(1000*1000/frequency));
   }
@@ -385,10 +383,10 @@ int main(int argc, char **argv) {
   for(int i=0; i<nb_sources;i++)
     cleaner[i](states[i]);
 
-  if(dev!=NULL)
-    clean_network(network_sources);
-  if(infi_path!=NULL)
-    clean_network(infiniband_sources);
+  /* if(dev!=NULL) */
+  /*   clean_network(network_sources); */
+  /* if(infi_path!=NULL) */
+  /*   clean_network(infiniband_sources); */
   if(perf_mode==0){
     clean_counters(fd);
     free(counter_values);
diff --git a/network.c b/network.c
index f3f8b3c43e1eace354aa8cbe2dd4e94234f85c3d..f197b9770ccc0e5aa808c80273d7298fb2781429 100644
--- a/network.c
+++ b/network.c
@@ -24,9 +24,29 @@
 #include <string.h>
 #include <stdint.h>
 
-int *init_network(char* dev) {
+struct network_t {
+  uint64_t values[4];
+  uint64_t tmp_values[4];
+  int sources[4];
+};
+
+unsigned int _get_network(uint64_t* results, int* sources) {
+  if(sources==NULL)
+    return 0;
+  char buffer[128];
+  for(int i=0; i<4; i++){
+    pread(sources[i], buffer, 127, 0);
+
+    results[i] = strtoull(buffer, NULL, 10);
+  }
+  return 4;
+}
+
+
+
+unsigned int init_network(char* dev, void**ptr) {
   if(dev==NULL)
-    return NULL;
+    return 0;
 
   if(strcmp(dev,"X")==0) {
     int f = open("/proc/net/route", O_RDONLY);
@@ -43,33 +63,41 @@ int *init_network(char* dev) {
 		       "/sys/class/net/%s/statistics/rx_bytes",
 		       "/sys/class/net/%s/statistics/tx_packets",
 		       "/sys/class/net/%s/statistics/tx_bytes"};
-  int* sources = malloc(sizeof(int)*4);
+
+  struct network_t *state = malloc(sizeof(struct network_t));
+
   char buffer2[256];
   for(int i=0; i<4; i++) {
     sprintf(buffer2, filenames[i], dev);
-    sources[i] = open(buffer2, O_RDONLY);
+    state->sources[i] = open(buffer2, O_RDONLY);
   }
+  *ptr = (void*) state;
+  _get_network(state->values, state->sources);
 
-  return sources;
+  return 4;
 }
 
-void get_network(uint64_t* results, int *sources) {
-  if(sources==NULL)
-    return;
-  char buffer[128];
-  for(int i=0; i<4; i++){
-    pread(sources[i], buffer, 127, 0);
+unsigned int get_network(uint64_t* results, void* ptr) {
+  struct network_t *state = (struct network_t *) ptr;
+  _get_network(state->tmp_values, state->sources);
+  for(int i=0; i<4; i++)
+    results[i] = state->tmp_values[i] - state->values[i];
 
-    results[i] = strtoull(buffer, NULL, 10);
-    
-    //results[i] = atoll(buffer);
-  }
+  memcpy(state->values, state->tmp_values, 4*sizeof(uint64_t));
+  return 4;
 }
 
-void clean_network(int *sources) {
-  if(sources==NULL)
+void clean_network(void *ptr) {
+  struct network_t *state = (struct network_t *) ptr;
+  if(state==NULL)
     return;
   for(int i=0;i<4;i++)
-    close(sources[i]);
-  free(sources);
+    close(state->sources[i]);
+  free(state);
 }    
+
+char *_labels_network[4] = {"rxp", "rxb", "txp", "txb"};
+void label_network(char **labels) {
+  for(int i=0; i<4; i++)
+    labels[i] = _labels_network[i];
+}
diff --git a/network.h b/network.h
index 7ff14ba3e81052135745fe9bcf35bdce1beb61ee..df25df89448421eb8fabc73607c6778b49b77cbb 100644
--- a/network.h
+++ b/network.h
@@ -18,6 +18,8 @@
 
  *******************************************************/
 
-int *init_network(char* dev);
-void get_network(uint64_t* results, int * sources);
-void clean_network(int *sources);
+unsigned int init_network(char*, void **);
+unsigned int get_network(uint64_t* results, void*);
+void clean_network(void *);
+void label_network(char **labels);
+