diff --git a/src/engine.c b/src/engine.c
index 55a1f1d6081fe8c114ca39202a9d3bef5d02fc10..a03df1594281df8ace8d110bad135531374da3b1 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -37,6 +37,7 @@
 
 /* MPI headers. */
 #ifdef WITH_MPI
+
 #include <mpi.h>
 #endif
 
@@ -1113,8 +1114,7 @@ void engine_allocate_foreign_particles(struct engine *e) {
 
   /* Allocate space for the foreign particles we will receive */
   if (count_parts_in > s->size_parts_foreign) {
-    if (s->parts_foreign != NULL)
-      swift_free("sparts_foreign", s->parts_foreign);
+    if (s->parts_foreign != NULL) swift_free("parts_foreign", s->parts_foreign);
     s->size_parts_foreign = engine_foreign_alloc_margin * count_parts_in;
     if (swift_memalign("parts_foreign", (void **)&s->parts_foreign, part_align,
                        sizeof(struct part) * s->size_parts_foreign) != 0)
@@ -4687,6 +4687,13 @@ void engine_clean(struct engine *e, const int fof) {
   scheduler_clean(&e->sched);
   space_clean(e->s);
   threadpool_clean(&e->threadpool);
+#if defined(WITH_MPI)
+  for (int i = 0; i < e->nr_proxies; ++i) {
+    proxy_clean(&e->proxies[i]);
+  }
+  free(e->proxy_ind);
+  free(e->proxies);
+#endif
 
   /* Close files */
   if (!fof && e->nodeID == 0) {
diff --git a/src/proxy.c b/src/proxy.c
index 4e7e979a68c311ecdde7d36f214a6d5dcded4f5e..0cd524ee5e6ff9f3b001798e356e795547b909af 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -983,6 +983,29 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) {
   p->nr_bparts_out = 0;
 }
 
+/**
+ * @brief Free the memory allocated by a #proxy
+ */
+void proxy_clean(struct proxy *p) {
+
+  free(p->cells_in);
+  free(p->cells_out);
+  free(p->cells_in_type);
+  free(p->cells_out_type);
+  swift_free("pcells_in", p->pcells_in);
+  swift_free("pcells_out", p->pcells_out);
+  swift_free("parts_out", p->parts_out);
+  swift_free("xparts_out", p->xparts_out);
+  swift_free("gparts_out", p->gparts_out);
+  swift_free("sparts_out", p->sparts_out);
+  swift_free("bparts_out", p->bparts_out);
+  swift_free("parts_in", p->parts_in);
+  swift_free("xparts_in", p->xparts_in);
+  swift_free("gparts_in", p->gparts_in);
+  swift_free("sparts_in", p->sparts_in);
+  swift_free("bparts_in", p->bparts_in);
+}
+
 /**
  * @brief Registers the MPI types for the proxy cells.
  */
diff --git a/src/proxy.h b/src/proxy.h
index c59c8ff84356188ab7935ab2151f1c8075045095..ec2482ee1ee27b0199337bc45c04530c37ce8b17 100644
--- a/src/proxy.h
+++ b/src/proxy.h
@@ -98,6 +98,7 @@ struct proxy {
 
 /* Function prototypes. */
 void proxy_init(struct proxy *p, int mynodeID, int nodeID);
+void proxy_clean(struct proxy *p);
 void proxy_parts_load(struct proxy *p, const struct part *parts,
                       const struct xpart *xparts, int N);
 void proxy_gparts_load(struct proxy *p, const struct gpart *gparts, int N);
diff --git a/src/space.c b/src/space.c
index 4d283309034b31cfda1b52be2d19060bf1579595..61bce1394729a6c325c9e64a08c86394a6dd359a 100644
--- a/src/space.c
+++ b/src/space.c
@@ -5462,6 +5462,12 @@ void space_clean(struct space *s) {
   swift_free("gparts", s->gparts);
   swift_free("sparts", s->sparts);
   swift_free("bparts", s->bparts);
+#ifdef WITH_MPI
+  swift_free("parts_foreign", s->parts_foreign);
+  swift_free("sparts_foreign", s->sparts_foreign);
+  swift_free("gparts_foreign", s->gparts_foreign);
+  swift_free("bparts_foreign", s->bparts_foreign);
+#endif
 }
 
 /**