diff --git a/src/mesh/ConnectivityDispatcher.cpp b/src/mesh/ConnectivityDispatcher.cpp
index 8c205a87183f698dee24b4335ea6c5356cc3e677..23ec824c44532e74c32f24614b4eb6a6db386871 100644
--- a/src/mesh/ConnectivityDispatcher.cpp
+++ b/src/mesh/ConnectivityDispatcher.cpp
@@ -5,7 +5,6 @@
 #include <utils/Partitioner.hpp>
 
 #include <iostream>
-#include <unordered_map>
 
 template <size_t Dimension>
 template <ItemType item_type>
@@ -15,8 +14,13 @@ ConnectivityDispatcher<Dimension>::_buildNewOwner()
   if constexpr (item_type == ItemType::cell) {
     CRSGraph connectivity_graph = m_connectivity.ownCellToCellGraph();
     Partitioner P;
-    Array new_owner_array   = P.partition(connectivity_graph);
-    CellValue cell_is_owned = m_connectivity.cellIsOwned();
+    Array new_owner_array = P.partition(connectivity_graph);
+
+    std::cout << "new_owner_array = " << new_owner_array << '\n';
+
+    const auto& cell_is_owned = m_connectivity.cellIsOwned();
+
+    std::cout << "cell_is_owned = " << cell_is_owned << '\n';
 
     CellValue<int> cell_new_owner(m_connectivity);
 
@@ -28,6 +32,9 @@ ConnectivityDispatcher<Dimension>::_buildNewOwner()
     }
     synchronize(cell_new_owner);
 
+    std::cout << "cell_new_owner = " << cell_new_owner << '\n';
+    std::cout << "cell_number    = " << m_connectivity.cellNumber() << '\n';
+
     this->_dispatchedInfo<ItemType::cell>().m_new_owner = cell_new_owner;
   } else {
     const auto& item_to_cell_matrix = m_connectivity.template getItemToItemMatrix<item_type, ItemType::cell>();
@@ -77,27 +84,30 @@ ConnectivityDispatcher<Dimension>::_buildItemListToSend()
   if constexpr (item_type == ItemType::cell) {
     const auto& node_to_cell_matrix = m_connectivity.nodeToCellMatrix();
     const auto& cell_to_node_matrix = m_connectivity.cellToNodeMatrix();
+    const auto& cell_is_owned       = m_connectivity.cellIsOwned();
 
     const auto& cell_new_owner = this->_dispatchedInfo<ItemType::cell>().m_new_owner;
 
     std::vector<std::vector<CellId>> cell_vector_to_send_by_proc(parallel::size());
     Array<bool> send_to_rank(parallel::size());
-    for (CellId j = 0; j < m_connectivity.numberOfCells(); ++j) {
+    for (CellId cell_id = 0; cell_id < m_connectivity.numberOfCells(); ++cell_id) {
       send_to_rank.fill(false);
-      const auto& cell_to_node = cell_to_node_matrix[j];
-
-      for (size_t R = 0; R < cell_to_node.size(); ++R) {
-        const NodeId& r          = cell_to_node[R];
-        const auto& node_to_cell = node_to_cell_matrix[r];
-        for (size_t K = 0; K < node_to_cell.size(); ++K) {
-          const CellId& k                 = node_to_cell[K];
-          send_to_rank[cell_new_owner[k]] = true;
+      const auto& cell_to_node = cell_to_node_matrix[cell_id];
+
+      for (size_t i_node = 0; i_node < cell_to_node.size(); ++i_node) {
+        const NodeId& node_id    = cell_to_node[i_node];
+        const auto& node_to_cell = node_to_cell_matrix[node_id];
+        for (size_t i_node_cell = 0; i_node_cell < node_to_cell.size(); ++i_node_cell) {
+          const CellId& node_cell = node_to_cell[i_node_cell];
+          if (cell_is_owned[node_cell]) {
+            send_to_rank[cell_new_owner[node_cell]] = true;
+          }
         }
       }
 
       for (size_t k = 0; k < send_to_rank.size(); ++k) {
         if (send_to_rank[k]) {
-          cell_vector_to_send_by_proc[k].push_back(j);
+          cell_vector_to_send_by_proc[k].push_back(cell_id);
         }
       }
     }
@@ -107,9 +117,15 @@ ConnectivityDispatcher<Dimension>::_buildItemListToSend()
     for (size_t i = 0; i < parallel::size(); ++i) {
       cell_list_to_send_by_proc[i] = convert_to_array(cell_vector_to_send_by_proc[i]);
     }
+
+    for (size_t i = 0; i < parallel::size(); ++i) {
+      std::cout << parallel::rank() << ": send to " << i << ": " << cell_list_to_send_by_proc[i] << '\n';
+    }
   } else {
     const auto& cell_list_to_send_by_proc = this->_dispatchedInfo<ItemType::cell>().m_list_to_send_by_proc;
 
+    const auto& item_is_owned = m_connectivity.template isOwned<item_type>();
+
     using ItemId                        = ItemIdT<item_type>;
     const auto& cell_to_sub_item_matrix = m_connectivity.template getItemToItemMatrix<ItemType::cell, item_type>();
 
@@ -125,7 +141,7 @@ ConnectivityDispatcher<Dimension>::_buildItemListToSend()
         const auto& cell_sub_item_list = cell_to_sub_item_matrix[cell_id];
         for (size_t r = 0; r < cell_sub_item_list.size(); ++r) {
           const ItemId& item_id = cell_sub_item_list[r];
-          if (not tag[item_id]) {
+          if (item_is_owned[item_id] and (not tag[item_id])) {
             item_id_vector.push_back(item_id);
             tag[item_id] = true;
           }
@@ -761,6 +777,24 @@ ConnectivityDispatcher<Dimension>::ConnectivityDispatcher(const ConnectivityType
 
   this->_buildItemReferenceList<ItemType::node>();
 
+  std::cout << "m_new_descriptor.nodeNumberVector() = " << m_new_descriptor.nodeNumberVector() << '\n';
+  std::cout << "m_new_descriptor.nodeOwnerVector()  = " << m_new_descriptor.nodeOwnerVector() << '\n';
+
+  std::cout << "m_new_descriptor.cellOwnerVector().size()          = " << m_new_descriptor.cellOwnerVector().size()
+            << '\n';
+  std::cout << "m_new_descriptor.cellTypeVector().size()           = " << m_new_descriptor.cellTypeVector().size()
+            << '\n';
+  std::cout << "m_new_descriptor.cellToNodeMatrix().numberOfRows() = "
+            << m_new_descriptor.cellToNodeMatrix().numberOfRows() << '\n';
+
+  for (CellId cell_id = 0; cell_id < m_new_descriptor.cellToNodeMatrix().numberOfRows(); ++cell_id) {
+    std::cout << "- cell [" << cell_id << "]("   // << m_new_descriptor.cellNumberVector()[cell_id]
+              << ")" << m_new_descriptor.cellToNodeMatrix()[cell_id] << '\n';
+  }
+
+  std::cout.flush();
+  parallel::barrier();
+
   m_dispatched_connectivity = ConnectivityType::build(m_new_descriptor);
 
   {