diff --git a/src/engine.c b/src/engine.c
index d27d5c49d0f48c015b4413575ca03ffb6a33dfb8..6facfeb3cf64683250eefc49aafc6d4201a82ef6 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -778,9 +778,12 @@ void engine_exchange_strays(struct engine *e, size_t offset_parts,
     if (pid == MPI_UNDEFINED) break;
     // message( "request from proxy %i has arrived." , pid / 3 );
     pid = 3 * (pid / 3);
+    
+    /* If all the requests for a given proxy have arrived... */
     if (reqs_in[pid + 0] == MPI_REQUEST_NULL &&
         reqs_in[pid + 1] == MPI_REQUEST_NULL &&
         reqs_in[pid + 2] == MPI_REQUEST_NULL) {
+      /* Copy the particle data to the part/xpart/gpart arrays. */
       struct proxy *p = &e->proxies[pid >> 1];
       memcpy(&s->parts[offset_parts + count_parts], p->parts_in,
              sizeof(struct part) * p->nr_parts_in);
@@ -793,6 +796,18 @@ void engine_exchange_strays(struct engine *e, size_t offset_parts,
             "received particle %lli, x=[%.3e %.3e %.3e], h=%.3e, from node %i.",
             s->parts[k].id, s->parts[k].x[0], s->parts[k].x[1],
             s->parts[k].x[2], s->parts[k].h, p->nodeID); */
+            
+      /* Re-link the gparts. */
+      for (int k = 0; k < p->nr_gparts_in; k++) {
+        struct gpart *gp = &s->gparts[offset_gparts + count_gparts + k];
+        if (gp->id >= 0) {
+          struct part *p = &s->parts[offset_gparts + count_parts + gp->id];
+          gp->part = p;
+          p->gpart = gp;
+        }
+      }
+      
+      /* Advance the counters. */
       count_parts += p->nr_parts_in;
       count_gparts += p->nr_gparts_in;
     }