diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt
index dd88e5fa8cc230802698181df8b0639af925b2e4..39f31282296315f1dea4647bcb9d02aa43169707 100644
--- a/src/mesh/CMakeLists.txt
+++ b/src/mesh/CMakeLists.txt
@@ -22,6 +22,7 @@ add_library(
   MedianDualMeshBuilder.cpp
   MeshBuilderBase.cpp
   MeshCellZone.cpp
+  MeshData.cpp
   MeshDataManager.cpp
   MeshEdgeBoundary.cpp
   MeshFaceBoundary.cpp
diff --git a/src/mesh/MeshData.cpp b/src/mesh/MeshData.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2fdddb387554258120bb36eba31e57a940e2576c
--- /dev/null
+++ b/src/mesh/MeshData.cpp
@@ -0,0 +1,25 @@
+#include <mesh/MeshData.hpp>
+
+#include <mesh/Connectivity.hpp>
+#include <mesh/ItemValueVariant.hpp>
+#include <mesh/Mesh.hpp>
+#include <output/NamedItemValueVariant.hpp>
+#include <output/VTKWriter.hpp>
+#include <utils/Exceptions.hpp>
+
+template <size_t Dimension>
+void
+MeshData<Dimension>::_storeBadMesh()
+{
+  VTKWriter writer("bad_mesh");
+  writer.writeOnMesh(std::make_shared<MeshType>(m_mesh.shared_connectivity(), m_mesh.xr()),
+                     {std::make_shared<NamedItemValueVariant>(std::make_shared<ItemValueVariant>(m_Vj), "volume")});
+  std::ostringstream error_msg;
+  error_msg << "mesh contains cells of non-positive volume (see " << rang::fgB::yellow << "bad_mesh.pvd"
+            << rang::fg::reset << " file).";
+  throw NormalError(error_msg.str());
+}
+
+template void MeshData<1>::_storeBadMesh();
+template void MeshData<2>::_storeBadMesh();
+template void MeshData<3>::_storeBadMesh();
diff --git a/src/mesh/MeshData.hpp b/src/mesh/MeshData.hpp
index a448862a01391a7c51bd1e7e9d75aff9e3df996e..78b9b81e69daf5e3fc0010bd8c737b7303759353 100644
--- a/src/mesh/MeshData.hpp
+++ b/src/mesh/MeshData.hpp
@@ -5,14 +5,9 @@
 #include <mesh/IMeshData.hpp>
 #include <mesh/ItemValue.hpp>
 #include <mesh/SubItemValuePerItem.hpp>
-#include <utils/Exceptions.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/PugsUtils.hpp>
 
-#include <output/VTKWriter.hpp>
-
-#include <map>
-
 template <size_t Dimension>
 class Connectivity;
 
@@ -49,6 +44,8 @@ class MeshData : public IMeshData
   FaceValue<const double> m_ll;
   EdgeValue<const Rd> m_xe;
 
+  void _storeBadMesh();
+
   PUGS_INLINE
   void
   _computeNl()
@@ -537,12 +534,7 @@ class MeshData : public IMeshData
     }();
 
     if (not parallel::allReduceAnd(is_valid)) {
-      VTKWriter writer("bad_mesh");
-      writer.writeMesh(m_mesh);
-      std::ostringstream error_msg;
-      error_msg << "mesh contains cells of non-positive volume (see " << rang::fgB::yellow << "bad_mesh.pvd"
-                << rang::fg::reset << " file).";
-      throw NormalError(error_msg.str());
+      this->_storeBadMesh();
     }
   }