diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index c258855f34a71c696bc632b822acc7e890f04ac4..6b071de30da1be3bb436871730d10f9788bb11aa 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -177,14 +177,14 @@ void GmshReader::_dispatch()
   Partitioner P;
   Array<int> cell_new_owner = P.partition(mesh_graph);
 
-  const std::vector<Array<const int>> cell_to_send_by_proc
+  const std::vector<Array<const CellId>> cell_to_send_by_proc
       = [&] () {
-          std::vector<std::vector<int>> cell_vector_to_send_by_proc(commSize());
+          std::vector<std::vector<CellId>> cell_vector_to_send_by_proc(commSize());
           for (size_t i=0; i<cell_new_owner.size(); ++i) {
-            cell_vector_to_send_by_proc[cell_new_owner[i]].push_back(i);
+            cell_vector_to_send_by_proc[cell_new_owner[i]].push_back(CellId{i});
           }
 
-          std::vector<Array<const int>> cell_to_send_by_proc(commSize());
+          std::vector<Array<const CellId>> cell_to_send_by_proc(commSize());
           for (size_t i=0; i<commSize(); ++i) {
             cell_to_send_by_proc[i] = convert_to_array(cell_vector_to_send_by_proc[i]);
           }
@@ -192,6 +192,20 @@ void GmshReader::_dispatch()
           return std::move(cell_to_send_by_proc);
         } ();
 
+  const std::vector<Array<const int>> cell_number_to_send_by_proc
+      = [&] () {
+          std::vector<Array<const int>> cell_number_to_send_by_proc(commSize());
+          for (size_t i=0; i<commSize(); ++i) {
+            const Array<const CellId>& cell_list = cell_to_send_by_proc[i];
+            Array<int> cell_number_list(cell_list.size());
+            parallel_for (cell_list.size(), PASTIS_LAMBDA(const CellId& cell_id) {
+#warning must use table of cell numbers
+                cell_number_list[cell_id] = cell_list[cell_id];
+              });
+            cell_number_to_send_by_proc[i] = cell_number_list;
+          }
+          return std::move(cell_number_to_send_by_proc);
+        } ();
 
   Array<int> nb_cell_to_send_by_proc(commSize());
   for (size_t i=0; i<commSize(); ++i) {
@@ -206,22 +220,30 @@ void GmshReader::_dispatch()
       + Sum(nb_cell_to_recv_by_proc)
       - Sum(nb_cell_to_send_by_proc);
 
-  std::vector<Array<int>> recv_cell_by_proc(commSize());
+  std::vector<Array<int>> recv_cell_number_by_proc(commSize());
   for (size_t i=0; i<commSize(); ++i) {
-    recv_cell_by_proc[i] = Array<int>(nb_cell_to_recv_by_proc[i]);
+    recv_cell_number_by_proc[i] = Array<int>(nb_cell_to_recv_by_proc[i]);
   }
 
-  exchange(cell_to_send_by_proc, recv_cell_by_proc);
+  exchange(cell_number_to_send_by_proc, recv_cell_number_by_proc);
 
-  Array<int> new_cell_id(new_cell_number);
+  // std::vector<Array<CellType>> cell_type_to_send_by_proc
+  //     = [&] () {
+  //         CellValue<const CellType> cell_type = mesh.connectivity().cellType();
+  //         std::vector<std::vector<CellType>> cell_type_vector_to_send_by_proc(commSize());
+  //         for (CellId i=0; i<mesh.numberOfCells(); ++i) {
+  //           cell_type_vector_to_send_by_proc[cell_new_owner[i]].push_back(cell_type[i]);
+  //         }
+  //         return cell_type_vector_to_send_by_proc;
+  //       } ();
 
   for (int i_rank=0; i_rank < commSize(); ++i_rank) {
     if (commRank() == i_rank) {
       std::cout << "----- rank=" << i_rank << " -----\n";
       for (int j_rank=0; j_rank < commSize(); ++j_rank) {
         std::cout << "recv from " << j_rank << ':';
-        for (size_t i=0; i<recv_cell_by_proc[j_rank].size(); ++i) {
-          std::cout << ' ' << recv_cell_by_proc[j_rank][i];
+        for (size_t i=0; i<recv_cell_number_by_proc[j_rank].size(); ++i) {
+          std::cout << ' ' << recv_cell_number_by_proc[j_rank][i];
         }
         std::cout << '\n' << std::flush;
       }