diff --git a/src/mesh/MeshBuilderBase.cpp b/src/mesh/MeshBuilderBase.cpp
index 205feceab31410426c1cace7534868ea4e0b615d..973a6099afb49595d02403c697bbb927d2a7ba63 100644
--- a/src/mesh/MeshBuilderBase.cpp
+++ b/src/mesh/MeshBuilderBase.cpp
@@ -188,7 +188,24 @@ MeshBuilderBase::_checkMesh() const
     }
   }
 
-  MeshDataManager::instance().getMeshData(mesh).Vj();
+  const auto& Cjr = MeshDataManager::instance().getMeshData(mesh).Cjr();
+  const auto& xr  = mesh.xr();
+
+  for (CellId cell_id = 0; cell_id < mesh.numberOfCells(); ++cell_id) {
+    double cell_volume = 0;
+    auto cell_nodes    = cell_to_node_matrix[cell_id];
+    for (size_t i_node = 0; i_node < cell_nodes.size(); ++i_node) {
+      cell_volume += dot(Cjr(cell_id, i_node), xr[cell_nodes[i_node]]);
+    }
+
+    if (cell_volume <= 0) {
+      std::ostringstream error_msg;
+      error_msg << "invalid mesh.\n\tThe following cell\n";
+      error_msg << "\t - id=" << cell_id << " number=" << connectivity.cellNumber()[cell_id] << '\n';
+      error_msg << "\thas non-positive volume: " << cell_volume / Dimension;
+      throw NormalError(error_msg.str());
+    }
+  }
 }
 
 template void MeshBuilderBase::_checkMesh<1>() const;