diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp
index ee6cfb5de3355fdaf6f33b92e94d52d2346eec56..fbc8a4ead83fa391e69947e74b9bfed0e40eacbd 100644
--- a/src/utils/Messenger.cpp
+++ b/src/utils/Messenger.cpp
@@ -114,28 +114,35 @@ _broadcast(Array<int>& array, int root_rank) const
   return array;
 }
 
-
+template <typename DataType>
 void Messenger::
-_exchange(const std::vector<Array<const int>>& sent_array_list,
-          std::vector<Array<int>>& recv_array_list) const
+_exchange(const std::vector<Array<DataType>>& sent_array_list,
+          std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const
 {
 #ifdef PASTIS_HAS_MPI
   std::vector<MPI_Request> request_list;
 
+  MPI_Datatype type = [&] () -> MPI_Datatype {
+                if constexpr (std::is_same_v<int,std::remove_const_t<DataType>>) {
+                  return MPI_INT;
+                } else if constexpr (std::is_same_v<CellType,std::remove_const_t<DataType>>) {
+                  return MPI_SHORT;
+                }
+              } ();
   for (size_t i_send=0; i_send<sent_array_list.size(); ++i_send) {
-    const Array<const int> sent_array = sent_array_list[i_send];
+    const Array<DataType> sent_array = sent_array_list[i_send];
     if (sent_array.size()>0) {
       MPI_Request request;
-      MPI_Isend(&(sent_array[0]), sent_array.size(), MPI_INT, i_send, 0, MPI_COMM_WORLD, &request);
+      MPI_Isend(&(sent_array[0]), sent_array.size(), type, i_send, 0, MPI_COMM_WORLD, &request);
       request_list.push_back(request);
     }
   }
 
   for (size_t i_recv=0; i_recv<recv_array_list.size(); ++i_recv) {
-    Array<int> recv_array = recv_array_list[i_recv];
+    Array<std::remove_const_t<DataType>> recv_array = recv_array_list[i_recv];
     if (recv_array.size()>0) {
       MPI_Request request;
-      MPI_Irecv(&(recv_array[0]), recv_array.size(), MPI_INT, i_recv, 0, MPI_COMM_WORLD, &request);
+      MPI_Irecv(&(recv_array[0]), recv_array.size(), type, i_recv, 0, MPI_COMM_WORLD, &request);
       request_list.push_back(request);
     }
   }
@@ -152,10 +159,16 @@ _exchange(const std::vector<Array<const int>>& sent_array_list,
 #endif // PASTIS_HAS_MPI
 }
 
-void Messenger::
-_exchange(const std::vector<Array<int>>& sent_array_list,
-          std::vector<Array<int>>& recv_array_list) const
-{
-  std::cerr << "NIY\n";
-  std::exit(1);
-}
+template
+void Messenger::_exchange(const std::vector<Array<int>>& sent_array_list,
+                          std::vector<Array<int>>& recv_array_list) const;
+template
+void Messenger::_exchange(const std::vector<Array<const int>>& sent_array_list,
+                          std::vector<Array<int>>& recv_array_list) const;
+
+template
+void Messenger::_exchange(const std::vector<Array<CellType>>& sent_array_list,
+                          std::vector<Array<CellType>>& recv_array_list) const;
+template
+void Messenger::_exchange(const std::vector<Array<const CellType>>& sent_array_list,
+                          std::vector<Array<CellType>>& recv_array_list) const;
diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp
index 796b08894ebdfc798cd5f0e70b2ab0bdf730fae9..f12b54e02606600bf675cb101145be6ed19dc6ac 100644
--- a/src/utils/Messenger.hpp
+++ b/src/utils/Messenger.hpp
@@ -6,6 +6,9 @@
 
 #include <Array.hpp>
 
+#warning REMOVE
+enum class CellType : unsigned short;
+
 class Messenger
 {
  private:
@@ -21,10 +24,10 @@ class Messenger
   Array<int> _broadcast(Array<int>& array, int root_rank) const;
   Array<int> _allToAll(const Array<int>& sent_array, Array<int>& recv_array) const;
 
-  void _exchange(const std::vector<Array<const int>>& sent_array_list,
-                 std::vector<Array<int>>& recv_array_list) const;
-  void _exchange(const std::vector<Array<int>>& sent_array_list,
-                 std::vector<Array<int>>& recv_array_list) const;
+  template <typename DataType>
+  void _exchange(const std::vector<Array<DataType>>& sent_array_list,
+                 std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const;
+
  public:
   static void create(int& argc, char* argv[]);
   static void destroy();
@@ -112,6 +115,8 @@ class Messenger
 
     if constexpr(std::is_same<RecvDataType, int>()) {
       _exchange(sent_array_list, recv_array_list);
+    } else if constexpr(std::is_same<RecvDataType, CellType>()) {
+      _exchange(sent_array_list, recv_array_list);
     } else {
       static_assert(std::is_same<RecvDataType, int>(), "unexpected type of data");
     }