diff --git a/src/utils/CastArray.hpp b/src/utils/CastArray.hpp
index d329b4ef35f70f3a612ca430c45d0ec23bb7ed9d..71bfc246f81d4b8a2b54afc8d914e08447244ed3 100644
--- a/src/utils/CastArray.hpp
+++ b/src/utils/CastArray.hpp
@@ -32,6 +32,18 @@ class [[nodiscard]] CastArray
     return m_values[i];
   }
 
+  template <typename ImageDataType, typename ImageCastDataType>
+  friend PUGS_INLINE void copy_to(const CastArray& source_array,
+                                  CastArray<ImageDataType, ImageCastDataType>& image_array)
+  {
+    static_assert(std::is_same_v<std::remove_const_t<CastDataType>, ImageCastDataType>);
+    static_assert(not std::is_const_v<ImageCastDataType>);
+
+    Assert(source_array.size() == image_array.size());
+
+    std::copy(source_array.m_values, source_array.m_values + source_array.size(), &image_array[0]);
+  }
+
   PUGS_INLINE
   CastArray& operator=(const CastArray&) = default;
 
diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp
index 69b144224d1afbb905ba5dee2d28ad03a4277c94..75ef1732a496e367917b55b86e4f2075570acd86 100644
--- a/src/utils/Messenger.hpp
+++ b/src/utils/Messenger.hpp
@@ -135,7 +135,7 @@ class Messenger
     MPI_Gather(data_address, data_array.size(), mpi_datatype, gather_address, data_array.size(), mpi_datatype, rank,
                MPI_COMM_WORLD);
 #else    // PUGS_HAS_MPI
-    value_copy(data_array, gather_array);
+    copy_to(data_array, gather_array);
 #endif   // PUGS_HAS_MPI
   }
 
@@ -176,7 +176,7 @@ class Messenger
     MPI_Gatherv(data_address, data_array.size(), mpi_datatype, gather_address, sizes_address, positions_address,
                 mpi_datatype, rank, MPI_COMM_WORLD);
 #else    // PUGS_HAS_MPI
-    value_copy(data_array, gather_array);
+    copy_to(data_array, gather_array);
 #endif   // PUGS_HAS_MPI
   }
 
@@ -221,7 +221,7 @@ class Messenger
     MPI_Allgather(data_address, data_array.size(), mpi_datatype, gather_address, data_array.size(), mpi_datatype,
                   MPI_COMM_WORLD);
 #else    // PUGS_HAS_MPI
-    value_copy(data_array, gather_array);
+    copy_to(data_array, gather_array);
 #endif   // PUGS_HAS_MPI
   }
 
@@ -261,7 +261,7 @@ class Messenger
     MPI_Allgatherv(data_address, data_array.size(), mpi_datatype, gather_address, sizes_address, positions_address,
                    mpi_datatype, MPI_COMM_WORLD);
 #else    // PUGS_HAS_MPI
-    value_copy(data_array, gather_array);
+    copy_to(data_array, gather_array);
 #endif   // PUGS_HAS_MPI
   }
 
@@ -322,7 +322,7 @@ class Messenger
 
     MPI_Alltoall(sent_address, count, mpi_datatype, recv_address, count, mpi_datatype, MPI_COMM_WORLD);
 #else    // PUGS_HAS_MPI
-    value_copy(sent_array, recv_array);
+    copy_to(sent_array, recv_array);
 #endif   // PUGS_HAS_MPI
   }
 
@@ -377,7 +377,7 @@ class Messenger
     Assert(sent_array_list.size() == 1);
     Assert(recv_array_list.size() == 1);
 
-    value_copy(sent_array_list[0], recv_array_list[0]);
+    copy_to(sent_array_list[0], recv_array_list[0]);
 #endif   // PUGS_HAS_MPI
   }