diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp
index 0b661076230b1c4822ec3e3ce051548e82687f8c..b4022d660475cf93eb9f9e1cb291622de22dba22 100644
--- a/src/language/modules/SchemeModule.cpp
+++ b/src/language/modules/SchemeModule.cpp
@@ -6,12 +6,16 @@
 #include <language/utils/BinaryOperatorProcessorBuilder.hpp>
 #include <language/utils/BuiltinFunctionEmbedder.hpp>
 #include <language/utils/TypeDescriptor.hpp>
+#include <mesh/Connectivity.hpp>
 #include <mesh/Mesh.hpp>
+#include <mesh/MeshData.hpp>
+#include <mesh/MeshDataManager.hpp>
 #include <scheme/AcousticSolver.hpp>
 #include <scheme/DirichletBoundaryConditionDescriptor.hpp>
 #include <scheme/DiscreteFunctionDescriptorP0.hpp>
 #include <scheme/DiscreteFunctionDescriptorP0Vector.hpp>
 #include <scheme/DiscreteFunctionInterpoler.hpp>
+#include <scheme/DiscreteFunctionP0.hpp>
 #include <scheme/DiscreteFunctionUtils.hpp>
 #include <scheme/DiscreteFunctionVectorInterpoler.hpp>
 #include <scheme/FourierBoundaryConditionDescriptor.hpp>
@@ -240,6 +244,48 @@ SchemeModule::SchemeModule()
 
                               ));
 
+  this
+    ->_addBuiltinFunction("cell_volume",
+                          std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IDiscreteFunction>(
+                            const std::shared_ptr<const IMesh>&)>>(
+
+                            [](const std::shared_ptr<const IMesh>& i_mesh) -> std::shared_ptr<const IDiscreteFunction> {
+                              switch (i_mesh->dimension()) {
+                              case 1: {
+                                constexpr size_t Dimension = 1;
+                                using MeshType             = Mesh<Connectivity<Dimension>>;
+                                std::shared_ptr<const MeshType> mesh =
+                                  std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(i_mesh);
+
+                                return std::make_shared<const DiscreteFunctionP0<
+                                  Dimension, double>>(mesh, copy(MeshDataManager::instance().getMeshData(*mesh).Vj()));
+                              }
+                              case 2: {
+                                constexpr size_t Dimension = 2;
+                                using MeshType             = Mesh<Connectivity<Dimension>>;
+                                std::shared_ptr<const MeshType> mesh =
+                                  std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(i_mesh);
+
+                                return std::make_shared<const DiscreteFunctionP0<
+                                  Dimension, double>>(mesh, copy(MeshDataManager::instance().getMeshData(*mesh).Vj()));
+                              }
+                              case 3: {
+                                constexpr size_t Dimension = 3;
+                                using MeshType             = Mesh<Connectivity<Dimension>>;
+                                std::shared_ptr<const MeshType> mesh =
+                                  std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(i_mesh);
+
+                                return std::make_shared<const DiscreteFunctionP0<
+                                  Dimension, double>>(mesh, copy(MeshDataManager::instance().getMeshData(*mesh).Vj()));
+                              }
+                              default: {
+                                throw UnexpectedError("invalid mesh dimension");
+                              }
+                              }
+                            }
+
+                            ));
+
   MathFunctionRegisterForVh{*this};
 }