diff --git a/src/cell.c b/src/cell.c
index b912ab6ae23fe7d6f81cdca280c0b23131d888eb..696f53069b9974c94f8b25e10f7dcba81fae8069 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -452,10 +452,7 @@ void cell_split(struct cell *c, ptrdiff_t parts_offset) {
   }
 
   /* Re-link the gparts. */
-  for (int k = 0; k < count; k++)
-    if (parts[k].gpart != NULL) {
-      parts[k].gpart->id_or_neg_offset = -(k + parts_offset);
-    }
+  part_relink_gparts(parts, count, parts_offset);
 
   /* Verify that _all_ the parts have been assigned to a cell. */
   /* for ( k = 1 ; k < 8 ; k++ )
@@ -548,10 +545,7 @@ void cell_split(struct cell *c, ptrdiff_t parts_offset) {
   }
 
   /* Re-link the parts. */
-  for (int k = 0; k < gcount; k++)
-    if (gparts[k].id_or_neg_offset < 0) {
-      parts[-gparts[k].id_or_neg_offset].gpart = &gparts[k];
-    }
+  part_relink_parts(gparts, gcount, parts - parts_offset);
 }
 
 /**
diff --git a/src/space.c b/src/space.c
index ef825545d919a09e12f4891577ef40297c62d1f3..954c9af7dd6d92adcd29d836dde16a61cf0f4792 100644
--- a/src/space.c
+++ b/src/space.c
@@ -403,10 +403,7 @@ void space_rebuild(struct space *s, double cell_max, int verbose) {
   space_parts_sort(s, ind, nr_parts, 0, s->nr_cells - 1, verbose);
 
   /* Re-link the gparts. */
-  for (size_t k = 0; k < nr_parts; k++)
-    if (s->parts[k].gpart != NULL) {
-      s->parts[k].gpart->id_or_neg_offset = -k;
-    }
+  part_relink_gparts(s->parts, nr_parts, 0);
 
   /* Verify space_sort_struct. */
   /* for ( k = 1 ; k < nr_parts ; k++ ) {
@@ -492,10 +489,7 @@ void space_rebuild(struct space *s, double cell_max, int verbose) {
   space_gparts_sort(s->gparts, gind, nr_gparts, 0, s->nr_cells - 1);
 
   /* Re-link the parts. */
-  for (int k = 0; k < nr_gparts; k++)
-    if (s->gparts[k].id_or_neg_offset < 0) {
-      s->parts[-s->gparts[k].id_or_neg_offset].gpart = &s->gparts[k];
-    }
+  part_relink_parts(s->gparts, nr_gparts, s->parts);
 
   /* We no longer need the indices as of here. */
   free(gind);