diff --git a/src/scheduler.c b/src/scheduler.c
index d08b8d6aa6c3319c5426732472c40c9d848d4d0d..0c3e6b3327a0aef5c0d22ac1d445c5b3d0f416b7 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -47,6 +47,7 @@
 #include "intrinsics.h"
 #include "kernel_hydro.h"
 #include "memuse.h"
+#include "mpiuse.h"
 #include "queue.h"
 #include "sort_part.h"
 #include "space.h"
@@ -1643,197 +1644,221 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) {
         break;
       case task_type_recv:
 #ifdef WITH_MPI
-        {
-          size_t count = 0;             /* Number of elements or bytes to receive */
-          MPI_Datatype type = MPI_BYTE; /* Type of the elements */
-          void *buff = NULL;            /* Buffer to accept elements */
+      {
+        size_t size = 0;              /* Size in bytes. */
+        size_t count = 0;             /* Number of elements to receive */
+        MPI_Datatype type = MPI_BYTE; /* Type of the elements */
+        void *buff = NULL;            /* Buffer to accept elements */
 
-          if (t->subtype == task_subtype_tend_part) {
+        if (t->subtype == task_subtype_tend_part) {
 
-            count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_hydro);
-            buff = t->buff = malloc(count);
+          count = size =
+              t->ci->mpi.pcell_size * sizeof(struct pcell_step_hydro);
+          buff = t->buff = malloc(count);
 
-          } else if (t->subtype == task_subtype_tend_gpart) {
+        } else if (t->subtype == task_subtype_tend_gpart) {
 
-            count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_grav);
-            buff = t->buff = malloc(count);
+          count = size = t->ci->mpi.pcell_size * sizeof(struct pcell_step_grav);
+          buff = t->buff = malloc(count);
 
-          } else if (t->subtype == task_subtype_tend_spart) {
+        } else if (t->subtype == task_subtype_tend_spart) {
 
-            count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_stars);
-            buff = t->buff = malloc(count);
+          count = size =
+              t->ci->mpi.pcell_size * sizeof(struct pcell_step_stars);
+          buff = t->buff = malloc(count);
 
-          } else if (t->subtype == task_subtype_tend_bpart) {
+        } else if (t->subtype == task_subtype_tend_bpart) {
 
-            count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_black_holes);
-            buff = t->buff = malloc(count);
+          count = size =
+              t->ci->mpi.pcell_size * sizeof(struct pcell_step_black_holes);
+          buff = t->buff = malloc(count);
 
-          } else if (t->subtype == task_subtype_part_swallow) {
+        } else if (t->subtype == task_subtype_part_swallow) {
 
-            count = t->ci->hydro.count * sizeof(struct black_holes_part_data);
-            buff = t->buff = malloc(count);
+          count = size =
+              t->ci->hydro.count * sizeof(struct black_holes_part_data);
+          buff = t->buff = malloc(count);
 
-          } else if (t->subtype == task_subtype_xv ||
-                     t->subtype == task_subtype_rho ||
-                     t->subtype == task_subtype_gradient) {
+        } else if (t->subtype == task_subtype_xv ||
+                   t->subtype == task_subtype_rho ||
+                   t->subtype == task_subtype_gradient) {
 
-            count = t->ci->hydro.count;
-            type = part_mpi_type;
-            buff = t->ci->hydro.parts;
+          count = t->ci->hydro.count;
+          size = count * sizeof(struct part);
+          type = part_mpi_type;
+          buff = t->ci->hydro.parts;
 
-          } else if (t->subtype == task_subtype_gpart) {
+        } else if (t->subtype == task_subtype_gpart) {
 
-            count = t->ci->grav.count;
-            type = gpart_mpi_type;
-            buff = t->ci->grav.parts;
+          count = t->ci->grav.count;
+          size = count * sizeof(struct gpart);
+          type = gpart_mpi_type;
+          buff = t->ci->grav.parts;
 
-          } else if (t->subtype == task_subtype_spart) {
+        } else if (t->subtype == task_subtype_spart) {
 
-            count = t->ci->stars.count;
-            type = spart_mpi_type;
-            buff = t->ci->stars.parts;
+          count = t->ci->stars.count;
+          size = count * sizeof(struct spart);
+          type = spart_mpi_type;
+          buff = t->ci->stars.parts;
 
-          } else if (t->subtype == task_subtype_bpart_rho ||
-                     t->subtype == task_subtype_bpart_swallow ||
-                     t->subtype == task_subtype_bpart_feedback) {
+        } else if (t->subtype == task_subtype_bpart_rho ||
+                   t->subtype == task_subtype_bpart_swallow ||
+                   t->subtype == task_subtype_bpart_feedback) {
 
-            count = t->ci->black_holes.count;
-            type = bpart_mpi_type;
-            buff = t->ci->black_holes.parts;
+          count = t->ci->black_holes.count;
+          size = count * sizeof(struct bpart);
+          type = bpart_mpi_type;
+          buff = t->ci->black_holes.parts;
 
-          } else if (t->subtype == task_subtype_multipole) {
+        } else if (t->subtype == task_subtype_multipole) {
 
-            count = t->ci->mpi.pcell_size;
-            type = multipole_mpi_type;
-            buff = t->buff = malloc(count * sizeof(struct gravity_tensors));
+          count = t->ci->mpi.pcell_size;
+          size = count * sizeof(struct gravity_tensors);
+          type = multipole_mpi_type;
+          buff = t->buff = malloc(size);
 
-          } else if (t->subtype == task_subtype_sf_counts) {
+        } else if (t->subtype == task_subtype_sf_counts) {
 
-            count = t->ci->mpi.pcell_size * sizeof(struct pcell_sf);
-            buff = t->buff = malloc(count);
+          count = size = t->ci->mpi.pcell_size * sizeof(struct pcell_sf);
+          buff = t->buff = malloc(count);
 
-          } else {
-            error("Unknown communication sub-type");
-          }
-
-          err = MPI_Irecv(buff, count, type, t->ci->nodeID, t->flags,
-                          subtaskMPI_comms[t->subtype], &t->req);
+        } else {
+          error("Unknown communication sub-type");
+        }
 
+        err = MPI_Irecv(buff, count, type, t->ci->nodeID, t->flags,
+                        subtaskMPI_comms[t->subtype], &t->req);
 
-          if (err != MPI_SUCCESS) {
-            mpi_error(err, "Failed to emit irecv for particle data.");
-          }
-          qid = 1 % s->nr_queues;
+        if (err != MPI_SUCCESS) {
+          mpi_error(err, "Failed to emit irecv for particle data.");
         }
+
+        /* And log, if logging enabled. */
+        mpiuse_log_allocation(t->type, t->subtype, &t->req, 1, size,
+                              t->ci->nodeID, t->flags);
+
+        qid = 1 % s->nr_queues;
+      }
 #else
         error("SWIFT was not compiled with MPI support.");
 #endif
-        break;
+      break;
       case task_type_send:
 #ifdef WITH_MPI
-        {
-          size_t size = 0;              /* Size in bytes. */
-          size_t count = 0;             /* Number of elements to send */
-          MPI_Datatype type = MPI_BYTE; /* Type of the elements */
-          void *buff = NULL;            /* Buffer to send */
+      {
+        size_t size = 0;              /* Size in bytes. */
+        size_t count = 0;             /* Number of elements to send */
+        MPI_Datatype type = MPI_BYTE; /* Type of the elements */
+        void *buff = NULL;            /* Buffer to send */
 
-          if (t->subtype == task_subtype_tend_part) {
+        if (t->subtype == task_subtype_tend_part) {
 
-            size = count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_hydro);
-            buff = t->buff = malloc(size);
-            cell_pack_end_step_hydro(t->ci, (struct pcell_step_hydro *)buff);
+          size = count =
+              t->ci->mpi.pcell_size * sizeof(struct pcell_step_hydro);
+          buff = t->buff = malloc(size);
+          cell_pack_end_step_hydro(t->ci, (struct pcell_step_hydro *)buff);
 
-          } else if (t->subtype == task_subtype_tend_gpart) {
+        } else if (t->subtype == task_subtype_tend_gpart) {
 
-            size = count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_grav);
-            buff = t->buff = malloc(size);
-            cell_pack_end_step_grav(t->ci, (struct pcell_step_grav *)buff);
+          size = count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_grav);
+          buff = t->buff = malloc(size);
+          cell_pack_end_step_grav(t->ci, (struct pcell_step_grav *)buff);
 
-          } else if (t->subtype == task_subtype_tend_spart) {
+        } else if (t->subtype == task_subtype_tend_spart) {
 
-            size = count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_stars);
-            buff = t->buff = malloc(size);
-            cell_pack_end_step_stars(t->ci, (struct pcell_step_stars *)buff);
+          size = count =
+              t->ci->mpi.pcell_size * sizeof(struct pcell_step_stars);
+          buff = t->buff = malloc(size);
+          cell_pack_end_step_stars(t->ci, (struct pcell_step_stars *)buff);
 
-          } else if (t->subtype == task_subtype_tend_bpart) {
+        } else if (t->subtype == task_subtype_tend_bpart) {
 
-            size = count = t->ci->mpi.pcell_size * sizeof(struct pcell_step_black_holes);
-            buff = t->buff = malloc(size);
-            cell_pack_end_step_black_holes(t->ci, (struct pcell_step_black_holes *)buff);
+          size = count =
+              t->ci->mpi.pcell_size * sizeof(struct pcell_step_black_holes);
+          buff = t->buff = malloc(size);
+          cell_pack_end_step_black_holes(t->ci,
+                                         (struct pcell_step_black_holes *)buff);
 
-          } else if (t->subtype == task_subtype_part_swallow) {
+        } else if (t->subtype == task_subtype_part_swallow) {
 
-            size = count = t->ci->hydro.count * sizeof(struct black_holes_part_data);
-            buff = t->buff = malloc(size);
-            cell_pack_part_swallow(t->ci, (struct black_holes_part_data *)buff);
+          size = count =
+              t->ci->hydro.count * sizeof(struct black_holes_part_data);
+          buff = t->buff = malloc(size);
+          cell_pack_part_swallow(t->ci, (struct black_holes_part_data *)buff);
 
-          } else if (t->subtype == task_subtype_xv ||
-                     t->subtype == task_subtype_rho ||
-                     t->subtype == task_subtype_gradient) {
+        } else if (t->subtype == task_subtype_xv ||
+                   t->subtype == task_subtype_rho ||
+                   t->subtype == task_subtype_gradient) {
 
-            count = t->ci->hydro.count;
-            size = count * sizeof(struct part);
-            type = part_mpi_type;
-            buff = t->ci->hydro.parts;
+          count = t->ci->hydro.count;
+          size = count * sizeof(struct part);
+          type = part_mpi_type;
+          buff = t->ci->hydro.parts;
 
-          } else if (t->subtype == task_subtype_gpart) {
+        } else if (t->subtype == task_subtype_gpart) {
 
-            count = t->ci->grav.count;
-            size = count * sizeof(struct gpart);
-            type = gpart_mpi_type;
-            buff = t->ci->grav.parts;
+          count = t->ci->grav.count;
+          size = count * sizeof(struct gpart);
+          type = gpart_mpi_type;
+          buff = t->ci->grav.parts;
 
-          } else if (t->subtype == task_subtype_spart) {
+        } else if (t->subtype == task_subtype_spart) {
 
-            count = t->ci->stars.count;
-            size = count * sizeof(struct spart);
-            type = spart_mpi_type;
-            buff = t->ci->stars.parts;
+          count = t->ci->stars.count;
+          size = count * sizeof(struct spart);
+          type = spart_mpi_type;
+          buff = t->ci->stars.parts;
 
-          } else if (t->subtype == task_subtype_bpart_rho ||
-                     t->subtype == task_subtype_bpart_swallow ||
-                     t->subtype == task_subtype_bpart_feedback) {
+        } else if (t->subtype == task_subtype_bpart_rho ||
+                   t->subtype == task_subtype_bpart_swallow ||
+                   t->subtype == task_subtype_bpart_feedback) {
 
-            count = t->ci->black_holes.count;
-            size = count * sizeof(struct bpart);
-            type = bpart_mpi_type;
-            buff = t->ci->black_holes.parts;
+          count = t->ci->black_holes.count;
+          size = count * sizeof(struct bpart);
+          type = bpart_mpi_type;
+          buff = t->ci->black_holes.parts;
 
-          } else if (t->subtype == task_subtype_multipole) {
+        } else if (t->subtype == task_subtype_multipole) {
 
-            count = t->ci->mpi.pcell_size;
-            size = count * sizeof(struct gravity_tensors);
-            type = multipole_mpi_type;
-            buff = t->buff = malloc(size);
-            cell_pack_multipoles(t->ci, (struct gravity_tensors *)buff);
+          count = t->ci->mpi.pcell_size;
+          size = count * sizeof(struct gravity_tensors);
+          type = multipole_mpi_type;
+          buff = t->buff = malloc(size);
+          cell_pack_multipoles(t->ci, (struct gravity_tensors *)buff);
 
-          } else if (t->subtype == task_subtype_sf_counts) {
+        } else if (t->subtype == task_subtype_sf_counts) {
 
-            size = count = t->ci->mpi.pcell_size * sizeof(struct pcell_sf);
-            buff = t->buff = malloc(size);
-            cell_pack_sf_counts(t->ci, (struct pcell_sf *)t->buff);
+          size = count = t->ci->mpi.pcell_size * sizeof(struct pcell_sf);
+          buff = t->buff = malloc(size);
+          cell_pack_sf_counts(t->ci, (struct pcell_sf *)t->buff);
 
-          } else {
-            error("Unknown communication sub-type");
-          }
+        } else {
+          error("Unknown communication sub-type");
+        }
 
-          if (size > s->mpi_message_limit) {
-            err = MPI_Isend(buff, count, type, t->cj->nodeID, t->flags,
-                            subtaskMPI_comms[t->subtype], &t->req);
-          } else {
-            err = MPI_Issend(buff, count, type, t->cj->nodeID, t->flags,
-                             subtaskMPI_comms[t->subtype], &t->req);
-          }
+        if (size > s->mpi_message_limit) {
+          err = MPI_Isend(buff, count, type, t->cj->nodeID, t->flags,
+                          subtaskMPI_comms[t->subtype], &t->req);
+        } else {
+          err = MPI_Issend(buff, count, type, t->cj->nodeID, t->flags,
+                           subtaskMPI_comms[t->subtype], &t->req);
+        }
 
-          if (err != MPI_SUCCESS) {
-            mpi_error(err, "Failed to emit isend for particle data.");
-          }
-          qid = 0;
+        if (err != MPI_SUCCESS) {
+          mpi_error(err, "Failed to emit isend for particle data.");
         }
+
+        /* And log, if logging enabled. */
+        mpiuse_log_allocation(t->type, t->subtype, &t->req, 1, size,
+                              t->cj->nodeID, t->flags);
+
+        qid = 0;
+      }
 #else
         error("SWIFT was not compiled with MPI support.");
 #endif
-        break;
+      break;
       default:
         qid = -1;
     }
diff --git a/src/task.c b/src/task.c
index 9a0aa64faa3983d409a2a6c619c58795eab8d5e5..c3d026d8036e5cf4b3e8f79ac4612cf02e7f5778 100644
--- a/src/task.c
+++ b/src/task.c
@@ -46,6 +46,7 @@
 #include "error.h"
 #include "inline.h"
 #include "lock.h"
+#include "mpiuse.h"
 
 /* Task type names. */
 const char *taskID_names[task_type_count] = {"none",
@@ -540,6 +541,10 @@ int task_lock(struct task *t) {
             "%s).",
             taskID_names[t->type], subtaskID_names[t->subtype], t->flags, buff);
       }
+
+      /* And log deactivation, if logging enabled. */
+      if (res) mpiuse_log_allocation(t->type, t->subtype, &t->req, 0, 0, 0, 0);
+
       return res;
 #else
       error("SWIFT was not compiled with MPI support.");