diff --git a/src/proxy.c b/src/proxy.c
index 8ff182e386c29d49e303e5c31bd01c1f1a48fe09..41ae0308b5f914ab4e043f4501c7e216cb1fe4e0 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -195,13 +195,14 @@ void proxy_parts_exch1(struct proxy *p) {
 #ifdef WITH_MPI
 
   /* Send the number of particles. */
-  int buff_out[2] = {p->nr_parts_out, p->nr_gparts_out};
-  if (MPI_Isend(buff_out, 2, MPI_INT, p->nodeID,
+  p->buff_out[0] = p->nr_parts_out;
+  p->buff_out[1] = p->nr_gparts_out;
+  if (MPI_Isend(p->buff_out, 2, MPI_INT, p->nodeID,
                 p->mynodeID * proxy_tag_shift + proxy_tag_count, MPI_COMM_WORLD,
                 &p->req_parts_count_out) != MPI_SUCCESS)
     error("Failed to isend nr of parts.");
-  // message( "isent particle count (%i) from node %i to node %i." ,
-  // p->nr_parts_out , p->mynodeID , p->nodeID ); fflush(stdout);
+  /* message( "isent particle counts [%i, %i] from node %i to node %i." ,
+  p->buff_out[0], p->buff_out[1], p->mynodeID , p->nodeID ); fflush(stdout); */
 
   /* Send the particle buffers. */
   if (p->nr_parts_out > 0) {
@@ -211,11 +212,7 @@ void proxy_parts_exch1(struct proxy *p) {
         MPI_Isend(p->xparts_out, sizeof(struct xpart) * p->nr_parts_out,
                   MPI_BYTE, p->nodeID,
                   p->mynodeID * proxy_tag_shift + proxy_tag_xparts,
-                  MPI_COMM_WORLD, &p->req_xparts_out) != MPI_SUCCESS ||
-        MPI_Isend(p->gparts_out, sizeof(struct gpart) * p->nr_gparts_out,
-                  MPI_BYTE, p->nodeID,
-                  p->mynodeID * proxy_tag_shift + proxy_tag_gparts,
-                  MPI_COMM_WORLD, &p->req_gparts_out) != MPI_SUCCESS)
+                  MPI_COMM_WORLD, &p->req_xparts_out) != MPI_SUCCESS)
       error("Failed to isend part data.");
     // message( "isent particle data (%i) to node %i." , p->nr_parts_out ,
     // p->nodeID ); fflush(stdout);
@@ -224,17 +221,21 @@ void proxy_parts_exch1(struct proxy *p) {
               p->parts_out[k].id, p->parts_out[k].x[0], p->parts_out[k].x[1],
               p->parts_out[k].x[2], p->parts_out[k].h, p->nodeID);*/
   }
+  if (p->nr_gparts_out > 0) {
+    if (MPI_Isend(p->gparts_out, sizeof(struct gpart) * p->nr_gparts_out,
+                  MPI_BYTE, p->nodeID,
+                  p->mynodeID * proxy_tag_shift + proxy_tag_gparts,
+                  MPI_COMM_WORLD, &p->req_gparts_out) != MPI_SUCCESS)
+      error("Failed to isend part data.");
+    // message( "isent gpart data (%i) to node %i." , p->nr_parts_out ,
+    // p->nodeID ); fflush(stdout);
+  }
 
   /* Receive the number of particles. */
-  int buff_in[2];
-  if (MPI_Irecv(buff_in, 2, MPI_INT, p->nodeID,
+  if (MPI_Irecv(p->buff_in, 2, MPI_INT, p->nodeID,
                 p->nodeID * proxy_tag_shift + proxy_tag_count, MPI_COMM_WORLD,
                 &p->req_parts_count_in) != MPI_SUCCESS)
     error("Failed to irecv nr of parts.");
-  p->nr_parts_in = buff_in[0];
-  p->nr_gparts_in = buff_in[1];
-// message( "irecv particle count on node %i from node %i." , p->mynodeID ,
-// p->nodeID ); fflush(stdout);
 
 #else
   error("SWIFT was not compiled with MPI support.");
@@ -245,6 +246,10 @@ void proxy_parts_exch2(struct proxy *p) {
 
 #ifdef WITH_MPI
 
+  /* Unpack the incomming parts counts. */
+  p->nr_parts_in = p->buff_in[0];
+  p->nr_gparts_in = p->buff_in[1];
+  
   /* Is there enough space in the buffer? */
   if (p->nr_parts_in > p->size_parts_in) {
     do {
@@ -275,14 +280,19 @@ void proxy_parts_exch2(struct proxy *p) {
                   MPI_COMM_WORLD, &p->req_parts_in) != MPI_SUCCESS ||
         MPI_Irecv(p->xparts_in, sizeof(struct xpart) * p->nr_parts_in, MPI_BYTE,
                   p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_xparts,
-                  MPI_COMM_WORLD, &p->req_xparts_in) != MPI_SUCCESS ||
-        MPI_Irecv(p->gparts_in, sizeof(struct gpart) * p->nr_gparts_in, MPI_BYTE,
-                  p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_gparts,
-                  MPI_COMM_WORLD, &p->req_gparts_in) != MPI_SUCCESS)
+                  MPI_COMM_WORLD, &p->req_xparts_in) != MPI_SUCCESS)
       error("Failed to irecv part data.");
     // message( "irecv particle data (%i) from node %i." , p->nr_parts_in ,
     // p->nodeID ); fflush(stdout);
   }
+  if (p->nr_gparts_in > 0) {
+    if (MPI_Irecv(p->gparts_in, sizeof(struct gpart) * p->nr_gparts_in, MPI_BYTE,
+                  p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_gparts,
+                  MPI_COMM_WORLD, &p->req_gparts_in) != MPI_SUCCESS)
+      error("Failed to irecv gpart data.");
+    // message( "irecv gpart data (%i) from node %i." , p->nr_gparts_in ,
+    // p->nodeID ); fflush(stdout);
+  }
 
 #else
   error("SWIFT was not compiled with MPI support.");
diff --git a/src/proxy.h b/src/proxy.h
index 014fb2e16631644f5d345589f917aa2a29bcf1a8..595147c0b60da5fc44359eff2d38fc4016293945 100644
--- a/src/proxy.h
+++ b/src/proxy.h
@@ -59,6 +59,9 @@ struct proxy {
   int nr_parts_in, nr_parts_out;
   int size_gparts_in, size_gparts_out;
   int nr_gparts_in, nr_gparts_out;
+  
+  /* Buffer to hold the incomming/outgoing particle counts. */
+  int buff_out[2], buff_in[2];
 
 /* MPI request handles. */
 #ifdef WITH_MPI