diff --git a/main.c b/main.c
index 33332a0e49a83ea9ecfbacad022d871b07502c92..e81642b8ddbdeeea0779b4f3b05ddefc78de94aa 100644
--- a/main.c
+++ b/main.c
@@ -38,21 +38,23 @@ int main(int argc, char ** argv){
         
         p[1] = pipes_b[1]; // pipe d'entree du fils suivant
         user_t user = user_init(i, NB_CHEVALS, p);
-        user_data_t user_data;
-        while(1) user_loop(user, user_data);
+        while(1) user_loop(user);
       break;
     }
   }
   pipes[0] = pipes_b[0];
 
-  id_request id_req;
-  request req = { .t = R_ID};
-  memcpy(req.content, &id_req, sizeof(id_req));
-  send_message(pipes[1], 0, &req, sizeof(req), M_REQUEST);
+  request req = { .t = REQ_ID};
+  id_request id_req = { .parent = req };
+  send_message(pipes[1], 0, &id_req, sizeof(id_req), M_REQUEST);
+
+  send_message(pipes[1], 3, &id_req, sizeof(id_req), M_REQUEST);
   
-  memcpy(req.content, &id_req, sizeof(id_req));
-  send_message(pipes[1], 1, &req, sizeof(req), M_REQUEST);
+  send_message(pipes[1], 1, &id_req, sizeof(id_req), M_REQUEST);
   
-  memcpy(req.content, &id_req, sizeof(id_req));
-  send_message(pipes[1], 3, &req, sizeof(req), M_REQUEST);
+  send_message(pipes[1], 2, &id_req, sizeof(id_req), M_REQUEST);
+
+  while(1){
+    
+  }
 }
diff --git a/user.c b/user.c
index 770456ed749134c17c7d9de245d6034bfc56db59..4cca3c019699fa10fc9d995b8ea9c243534517b0 100644
--- a/user.c
+++ b/user.c
@@ -8,7 +8,18 @@
 
 user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[]){
   cheval_t chevals[nb_cheval];
-  
+
+
+  receive_data_t r_data = {
+    .pipes = pipes,
+    .id = id,
+    .r_buf = malloc(R_CHUNK_SIZE),
+    .cont_id = -1,
+    .cont_type = -1,
+    .content_off = 0,
+    .onRequest = user_onRequest,
+  };
+
   user_t out = {
     .id = id,
     .c = chevals,
@@ -16,52 +27,60 @@ user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[]){
     .pipes = pipes,
   };
 
+  out.r_data = malloc(sizeof(r_data));
+  memcpy(out.r_data, &r_data, sizeof(r_data));
+
   return out;
 }
 
-void user_loop(user_t user, user_data_t data){
+void user_loop(user_t user){
+  receive_loop(user.r_data);
+}
+
+void receive_loop(receive_data_t* data){
   message in;
-  read(user.pipes[0], &in, sizeof(message));
+  read(data->pipes[0], &in, sizeof(message));
   
-  if(in.dest_id != user.id){ // si le message ne nous est pas destine on le passe au suivant de facon transparente
-    write(user.pipes[1], &in, sizeof(message));
+  if(in.dest_id != data->id){ // si le message ne nous est pas destine on le passe au suivant de facon transparente
+    write(data->pipes[1], &in, sizeof(message));
     return;
   }
   
   switch(in.t){
     case M_REQUEST:
-      memcpy(&data.req, &in.content + data.content_off, in.content_size);
-      data.content_off = in.content_size;
-      
-      if(in.cont_id != -1) break; // si c'est le dernier message
+      data->content_off = 0;
+      data->r_buf = realloc(data->r_buf, R_CHUNK_SIZE);
 
-      user_onRequest(user, data.req);
+      memcpy(data->r_buf, &in.content + data->content_off, in.content_size);
+      data->content_off = in.content_size;     
     break;
+
     case M_CONT:
-      if(in.id != data.cont_id) fprintf(stderr, "Continuation message of an unknown source, dropping it");
-      if(in.t != data.cont_type) fprintf(stderr, "Continuation message of the wrong type, dropping it");
-
-      void* target;
-      switch(data.cont_type){
-        case M_REQUEST:
-          target = &data.req;
-        break;
-        default:
-          fprintf(stderr, "message type not implemented, dropping it");
-        break;
+      if(in.id != data->cont_id){
+        fprintf(stderr, "Continuation message of an unknown source, dropping it");
+        return;
+      }
+      if(in.t != data->cont_type){
+        fprintf(stderr, "Continuation message of the wrong type, dropping it");
+        return;
       }
 
-      memcpy(target, &in.content + data.content_off, in.content_size);
-      data.content_off += in.content_size;
-
-      if(in.cont_id != -1) break;
-
-      user_onRequest(user, data.req);
+      data->r_buf = realloc(data->r_buf, data->content_off + in.content_size);
+      memcpy(data->r_buf, &in.content + data->content_off, in.content_size);
+      data->content_off += in.content_size;
     break;
+
     case M_RESPONSE:
 
     break;
   }
+  if(in.cont_id != -1){ // si ce n'est pas le dernier message
+    data->cont_id = in.cont_id;
+    data->cont_type = in.t;
+    return;
+  }
+
+  data->onRequest(data);
 }
 
 void send_message(int pipe, int dest_id, void* content, int content_size, M_TYPE type){
@@ -85,10 +104,20 @@ void send_message(int pipe, int dest_id, void* content, int content_size, M_TYPE
   }
 }
 
-void user_onRequest(user_t user, request r){
-  switch(r.t){
-    case R_ID:
-      printf("%d received id request\n", user.id);
+void user_onRequest(receive_data_t* data){
+  request req;
+  memcpy(&req, data->r_buf, sizeof(req));
+
+  switch(req.t){
+    case REQ_ID:
+      ;
+      response resp = { .t = RESP_ID};
+      id_response id_resp = {
+        .parent = resp,
+        .id = data->id,
+      };
+      send_message(data->pipes[1], -1, &id_resp, sizeof(id_resp), M_RESPONSE);
+      printf("%d received id request\n", data->id);
     break;
   }
 }
\ No newline at end of file
diff --git a/user.h b/user.h
index a1c97b1804eeaa4de5216493fdf6e510dab3b138..327cfd21210bed4ca4c70471302470bbb75fbca0 100644
--- a/user.h
+++ b/user.h
@@ -4,11 +4,14 @@ typedef struct {
   int escalier; // si le cheval est dans l'escalier
 } cheval_t;
 
+typedef struct receive_data receive_data_t;
+
 typedef struct {
   unsigned int id;
   cheval_t* c;
   unsigned char nb_chevals;
   int* pipes;
+  receive_data_t* r_data;
 } user_t;
 
 #define M_SIZE 64
@@ -24,27 +27,46 @@ typedef struct {
   int cont_id; // id du message continuant celui-ci -1 si c'est le dernier
 } message;
 
-#define R_SIZE 64
+#define REQ_SIZE 64
 
-typedef enum R_TYPE {R_ID} R_TYPE;
+typedef enum REQ_TYPE {REQ_ID} REQ_TYPE;
 
 typedef struct {
-  R_TYPE t;
-  char content[R_SIZE];
+  REQ_TYPE t;
 } request;
 
 typedef struct {
-  
+  request parent;
 } id_request;
 
+typedef enum RESP_TYPE {RESP_ID} RESP_TYPE;
+
+typedef struct {
+  RESP_TYPE t;
+} response;
+
 typedef struct {
-  request req; // request actuelle
+  response parent;
+  int id;
+} id_response;
+
+#define R_CHUNK_SIZE 64
+
+
+typedef void (*m_onRequest)(receive_data_t* buf);
+
+struct receive_data {
+  int* pipes;
+  int id;
+  char * r_buf;
   int cont_id; // id du prochain message attendu
   M_TYPE cont_type; // type de message en cours de reception
   int content_off; //offset de reception actuel
-} user_data_t;
+  m_onRequest onRequest;
+};
 
 user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[]);
-void user_loop(user_t user, user_data_t);
+void user_loop(user_t user);
+void receive_loop(receive_data_t* data);
 void send_message(int pipe, int dest_id, void* content, int content_size, M_TYPE type);
-void user_onRequest(user_t user, request r);
\ No newline at end of file
+void user_onRequest(receive_data_t* data);
\ No newline at end of file