diff --git a/src/mesh/Connectivity3D.hpp b/src/mesh/Connectivity3D.hpp
index 0afaecbf880aa1085fecb9544198f2b510f7eb72..f57829ef0c5a04145ba63651d1915186cf2ae9df 100644
--- a/src/mesh/Connectivity3D.hpp
+++ b/src/mesh/Connectivity3D.hpp
@@ -56,10 +56,18 @@ private:
   class Face
   {
    private:
-    std::vector<unsigned int> m_node_id_list;
     bool m_reversed;
+    std::vector<unsigned int> m_node_id_list;
 
    public:
+    friend std::ostream& operator<<(std::ostream& os, const Face& f)
+    {
+      for (auto id : f.m_node_id_list) {
+        std::cout << id << ' ';
+      }
+      return os;
+    }
+
     KOKKOS_INLINE_FUNCTION
     const bool& reversed() const
     {
@@ -76,24 +84,36 @@ private:
     std::vector<unsigned int> _sort(const std::vector<unsigned int>& node_list)
     {
       const auto min_id = std::min_element(node_list.begin(), node_list.end());
-      const size_t shift = std::distance(min_id, node_list.begin());
+      const int shift = std::distance(node_list.begin(), min_id);
 
       std::vector<unsigned int> rotated_node_list(node_list.size());
-      if (node_list[(shift+1)%node_list.size()] < node_list[(shift+node_list.size()-1)%node_list.size()]) {
+      if (node_list[(shift+1)%node_list.size()] > node_list[(shift+node_list.size()-1)%node_list.size()]) {
         for (size_t i=0; i<node_list.size(); ++i) {
-          const size_t reverse_shift = node_list.size()-shift;
-          rotated_node_list[(reverse_shift+node_list.size()-i)%node_list.size()] = node_list[i];
+          rotated_node_list[i] = node_list[(shift+node_list.size()-i)%node_list.size()];
           m_reversed = true;
         }
       } else {
         for (size_t i=0; i<node_list.size(); ++i) {
-          rotated_node_list[(shift+i)%node_list.size()] = node_list[i];
+          rotated_node_list[i] = node_list[(shift+i)%node_list.size()];
         }
       }
 
       return rotated_node_list;
     }
 
+    bool operator==(const Face& f) const
+    {
+      if (m_node_id_list.size() == f.nodeIdList().size()) {
+        for (size_t j=0; j<m_node_id_list.size(); ++j) {
+          if (m_node_id_list[j] != f.nodeIdList()[j]) {
+            return false;
+          }
+        }
+        return true;
+      }
+      return false;
+    }
+
     KOKKOS_INLINE_FUNCTION
     bool operator<(const Face& f) const
     {
@@ -119,8 +139,8 @@ private:
 
     KOKKOS_INLINE_FUNCTION
     Face(const std::vector<unsigned int>& given_node_id_list)
-        : m_node_id_list(_sort(given_node_id_list)),
-          m_reversed(false)
+        : m_reversed(false),
+          m_node_id_list(_sort(given_node_id_list))
     {
       ;
     }
@@ -149,45 +169,45 @@ private:
         }
         case 8: { // hexahedron
           // face 0
-          Face f0({m_cell_nodes(j,0),
-                   m_cell_nodes(j,1),
+          Face f0({m_cell_nodes(j,3),
                    m_cell_nodes(j,2),
-                   m_cell_nodes(j,3)});
+                   m_cell_nodes(j,1),
+                   m_cell_nodes(j,0)});
           face_cells_map[f0].push_back(std::make_tuple(j, 0, f0.reversed()));
 
           // face 1
           Face f1({m_cell_nodes(j,4),
-                   m_cell_nodes(j,7),
+                   m_cell_nodes(j,5),
                    m_cell_nodes(j,6),
-                   m_cell_nodes(j,5)});
+                   m_cell_nodes(j,7)});
           face_cells_map[f1].push_back(std::make_tuple(j, 1, f1.reversed()));
 
           // face 2
           Face f2({m_cell_nodes(j,0),
-                   m_cell_nodes(j,3),
+                   m_cell_nodes(j,4),
                    m_cell_nodes(j,7),
-                   m_cell_nodes(j,4)});
+                   m_cell_nodes(j,3)});
           face_cells_map[f2].push_back(std::make_tuple(j, 2, f2.reversed()));
 
           // face 3
           Face f3({m_cell_nodes(j,1),
-                   m_cell_nodes(j,5),
+                   m_cell_nodes(j,2),
                    m_cell_nodes(j,6),
-                   m_cell_nodes(j,2)});
+                   m_cell_nodes(j,5)});
           face_cells_map[f3].push_back(std::make_tuple(j, 3, f3.reversed()));
 
           // face 4
           Face f4({m_cell_nodes(j,0),
-                   m_cell_nodes(j,4),
+                   m_cell_nodes(j,1),
                    m_cell_nodes(j,5),
-                   m_cell_nodes(j,1)});
+                   m_cell_nodes(j,4)});
           face_cells_map[f4].push_back(std::make_tuple(j, 4, f4.reversed()));
 
           // face 5
           Face f5({m_cell_nodes(j,3),
-                   m_cell_nodes(j,2),
+                   m_cell_nodes(j,7),
                    m_cell_nodes(j,6),
-                   m_cell_nodes(j,7)});
+                   m_cell_nodes(j,2)});
           face_cells_map[f5].push_back(std::make_tuple(j, 5, f5.reversed()));
 
           cell_nb_faces[j] = 6;
@@ -257,7 +277,7 @@ private:
     std::cerr << __FILE__ << ':' << __LINE__ << ':'
               << rang::fg::red << " m_max_nb_face_per_cell forced to 6" << rang::fg::reset << '\n';
     m_max_nb_face_per_cell = 6;
-    Kokkos::View<unsigned int**> cell_faces("cell_faces", m_number_of_faces, m_max_nb_face_per_cell);
+    Kokkos::View<unsigned int**> cell_faces("cell_faces", m_number_of_cells, m_max_nb_face_per_cell);
     {
       int l=0;
       for (const auto& face_cells_vector : face_cells_map) {
@@ -273,16 +293,17 @@ private:
     }
     m_cell_faces = cell_faces;
 
-    Kokkos::View<bool**> cell_faces_is_reversed("cell_faces_is_reversed", m_number_of_faces, m_max_nb_face_per_cell);
+    Kokkos::View<bool**> cell_faces_is_reversed("cell_faces_is_reversed", m_number_of_cells, m_max_nb_face_per_cell);
     {
       int l=0;
       for (const auto& face_cells_vector : face_cells_map) {
         const auto& cells_vector = face_cells_vector.second;
         for (unsigned short lj=0; lj<cells_vector.size(); ++lj) {
           unsigned int cell_number;
+          unsigned short cell_local_face;
           bool reversed;
-          std::tie(cell_number, std::ignore, reversed);
-          cell_faces_is_reversed(cell_number,lj) = reversed;
+          std::tie(cell_number, cell_local_face, reversed) = cells_vector[lj];
+          cell_faces_is_reversed(cell_number,cell_local_face) = reversed;
         }
         ++l;
       }
@@ -436,15 +457,18 @@ private:
     return m_face_cell_local_face;
   }
 
-  unsigned int getFaceNumber(const unsigned int node0_id,
-                             const unsigned int node1_id) const
+  unsigned int getFaceNumber(const std::vector<unsigned int>& face_nodes) const
   {
 #warning rewrite
-    const unsigned int n0_id = std::min(node0_id, node1_id);
-    const unsigned int n1_id = std::max(node0_id, node1_id);
     // worst code ever
+    const Face face(face_nodes);
     for (unsigned int l=0; l<m_number_of_faces; ++l) {
-      if ((m_face_nodes(l,0) == n0_id) and (m_face_nodes(l,1) == n1_id)) {
+      std::vector<unsigned int> nodes(m_face_nb_nodes[l]);
+      for (size_t r=0; r<nodes.size(); ++r) {
+        nodes[r] = m_face_nodes(l,r);
+      }
+      Face f(nodes);
+      if (f == face) {
         return l;
       }
     }