diff --git a/runtime/domain/block_forest.cpp b/runtime/domain/block_forest.cpp
index e2d73070808cf27bd1c17b52be91d8c4d5fc3b5a..81a416641b9c9329a5c7ebadd4cf4565ef923e30 100644
--- a/runtime/domain/block_forest.cpp
+++ b/runtime/domain/block_forest.cpp
@@ -368,8 +368,10 @@ void BlockForest::communicateSizes(int dim, const int *nsend, int *nrecv) {
         nranks++;
     }
 
-    MPI_Waitall(nranks, send_requests.data(), MPI_STATUSES_IGNORE);
-    MPI_Waitall(nranks, recv_requests.data(), MPI_STATUSES_IGNORE);
+    if(nranks > 0) {
+        MPI_Waitall(nranks, send_requests.data(), MPI_STATUSES_IGNORE);
+        MPI_Waitall(nranks, recv_requests.data(), MPI_STATUSES_IGNORE);
+    }
 }
 
 void BlockForest::communicateData(
@@ -377,8 +379,8 @@ void BlockForest::communicateData(
     const real_t *send_buf, const int *send_offsets, const int *nsend,
     real_t *recv_buf, const int *recv_offsets, const int *nrecv) {
 
-    std::vector<MPI_Request> send_requests(ranks.size(), MPI_REQUEST_NULL);
-    std::vector<MPI_Request> recv_requests(ranks.size(), MPI_REQUEST_NULL);
+    std::vector<MPI_Request> send_requests;
+    std::vector<MPI_Request> recv_requests;
     size_t nranks = 0;
 
     for(auto neigh_rank: ranks) {
@@ -386,15 +388,13 @@ void BlockForest::communicateData(
         real_t *recv_ptr = &recv_buf[recv_offsets[nranks] * elem_size];
 
         if(neigh_rank != rank) {
-            MPI_Irecv(
-                recv_ptr, nrecv[nranks] * elem_size, MPI_DOUBLE, neigh_rank, 0,
-                MPI_COMM_WORLD, &recv_requests[0]);
+            MPI_Request send_req, recv_req;
 
-            MPI_Isend(
-                send_ptr, nsend[nranks] * elem_size, MPI_DOUBLE, neigh_rank, 0,
-                MPI_COMM_WORLD, &send_requests[0]);
+            MPI_Irecv(recv_ptr, nrecv[nranks] * elem_size, MPI_DOUBLE, neigh_rank, 0, MPI_COMM_WORLD, &recv_req);
+            MPI_Isend(send_ptr, nsend[nranks] * elem_size, MPI_DOUBLE, neigh_rank, 0, MPI_COMM_WORLD, &send_req);
 
-            nranks++;
+            send_requests.push_back(send_req);
+            recv_requests.push_back(recv_req);
         } else {
             pairs::copy_in_device(recv_ptr, send_ptr, nsend[nranks] * elem_size * sizeof(real_t));
         }
@@ -402,8 +402,13 @@ void BlockForest::communicateData(
         nranks++;
     }
 
-    MPI_Waitall(nranks, send_requests.data(), MPI_STATUSES_IGNORE);
-    MPI_Waitall(nranks, recv_requests.data(), MPI_STATUSES_IGNORE);
+    if(!send_requests.empty()) {
+        MPI_Waitall(send_requests.size(), send_requests.data(), MPI_STATUSES_IGNORE);
+    }
+
+    if(!recv_requests.empty()) {
+        MPI_Waitall(recv_requests.size(), recv_requests.data(), MPI_STATUSES_IGNORE);
+    }
 }
 
 void BlockForest::communicateAllData(