diff --git a/src/scheme/AcousticSolver.cpp b/src/scheme/AcousticSolver.cpp
index 3336fd716822a86f86fc335a3f02cb80882a26fc..6bac5a6b3d920f9f3b5654e826bf9b974a9fcd0f 100644
--- a/src/scheme/AcousticSolver.cpp
+++ b/src/scheme/AcousticSolver.cpp
@@ -1,5 +1,6 @@
 #include <scheme/AcousticSolver.hpp>
 
+#include <language/utils/InterpolateItemValue.hpp>
 #include <mesh/ItemValueUtils.hpp>
 #include <mesh/MeshNodeBoundary.hpp>
 #include <scheme/DirichletBoundaryConditionDescriptor.hpp>
diff --git a/src/scheme/DiscreteFunctionInterpoler.cpp b/src/scheme/DiscreteFunctionInterpoler.cpp
index fda64fdcb82d1eb36b8925e9cdc438989cd92306..c8eeaf94cb8d4f1037b28ebf65d377660464c093 100644
--- a/src/scheme/DiscreteFunctionInterpoler.cpp
+++ b/src/scheme/DiscreteFunctionInterpoler.cpp
@@ -1,5 +1,6 @@
 #include <scheme/DiscreteFunctionInterpoler.hpp>
 
+#include <language/utils/InterpolateItemValue.hpp>
 #include <scheme/DiscreteFunctionP0.hpp>
 #include <utils/Exceptions.hpp>
 
@@ -7,8 +8,14 @@ template <size_t Dimension, typename DataType>
 std::shared_ptr<IDiscreteFunction>
 DiscreteFunctionInterpoler::_interpolate() const
 {
-  std::shared_ptr mesh = std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(m_mesh);
-  return std::make_shared<DiscreteFunctionP0<Dimension, DataType>>(mesh, m_function_id);
+  std::shared_ptr mesh    = std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(m_mesh);
+  using MeshDataType      = MeshData<Dimension>;
+  MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*mesh);
+
+  return std::make_shared<
+    DiscreteFunctionP0<Dimension, DataType>>(mesh,
+                                             InterpolateItemValue<DataType(TinyVector<Dimension>)>::
+                                               template interpolate<ItemType::cell>(m_function_id, mesh_data.xj()));
 }
 
 template <size_t Dimension>
diff --git a/src/scheme/DiscreteFunctionP0.hpp b/src/scheme/DiscreteFunctionP0.hpp
index df64472fe6281f06ccdb32148f3e0bd596216710..c2ee7f44d8d26ea619511f96ae89675def2243ac 100644
--- a/src/scheme/DiscreteFunctionP0.hpp
+++ b/src/scheme/DiscreteFunctionP0.hpp
@@ -3,7 +3,6 @@
 
 #include <scheme/IDiscreteFunction.hpp>
 
-#include <language/utils/InterpolateItemValue.hpp>
 #include <mesh/Connectivity.hpp>
 #include <mesh/Mesh.hpp>
 #include <mesh/MeshData.hpp>
@@ -246,16 +245,6 @@ class DiscreteFunctionP0 : public IDiscreteFunction
     return ratio;
   }
 
-  DiscreteFunctionP0(const std::shared_ptr<const MeshType>& mesh, const FunctionSymbolId& function_id) : m_mesh(mesh)
-  {
-    using MeshDataType      = MeshData<Dimension>;
-    MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*mesh);
-
-    m_cell_values =
-      InterpolateItemValue<DataType(TinyVector<Dimension>)>::template interpolate<ItemType::cell>(function_id,
-                                                                                                  mesh_data.xj());
-  }
-
   DiscreteFunctionP0(const std::shared_ptr<const MeshType>& mesh) : m_mesh{mesh}, m_cell_values{mesh->connectivity()} {}
 
   DiscreteFunctionP0(const std::shared_ptr<const MeshType>& mesh, const CellValue<DataType>& cell_value)
diff --git a/src/scheme/DiscreteFunctionP0Vector.hpp b/src/scheme/DiscreteFunctionP0Vector.hpp
index d689258f88f7139fc05bd16ba11307338607e578..103718b125e123692241715e697ab89869d078eb 100644
--- a/src/scheme/DiscreteFunctionP0Vector.hpp
+++ b/src/scheme/DiscreteFunctionP0Vector.hpp
@@ -3,7 +3,6 @@
 
 #include <scheme/IDiscreteFunction.hpp>
 
-#include <language/utils/InterpolateItemArray.hpp>
 #include <mesh/Connectivity.hpp>
 #include <mesh/ItemArray.hpp>
 #include <mesh/Mesh.hpp>
@@ -195,17 +194,6 @@ class DiscreteFunctionP0Vector : public IDiscreteFunction
     return product;
   }
 
-  DiscreteFunctionP0Vector(const std::shared_ptr<const MeshType>& mesh,
-                           const std::vector<FunctionSymbolId>& function_symbol_id_list)
-    : m_mesh(mesh)
-  {
-    using MeshDataType      = MeshData<Dimension>;
-    MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*mesh);
-
-    m_cell_arrays = InterpolateItemArray<DataType(
-      TinyVector<Dimension>)>::template interpolate<ItemType::cell>(function_symbol_id_list, mesh_data.xj());
-  }
-
   DiscreteFunctionP0Vector(const std::shared_ptr<const MeshType>& mesh, size_t size)
     : m_mesh{mesh}, m_cell_arrays{mesh->connectivity(), size}
   {}
diff --git a/src/scheme/DiscreteFunctionVectorInterpoler.cpp b/src/scheme/DiscreteFunctionVectorInterpoler.cpp
index 1a5077377dd1858f5f3c2fa495621598784e8360..8b2d50b12fe85092d837c699e62973bdec43da08 100644
--- a/src/scheme/DiscreteFunctionVectorInterpoler.cpp
+++ b/src/scheme/DiscreteFunctionVectorInterpoler.cpp
@@ -1,5 +1,6 @@
 #include <scheme/DiscreteFunctionVectorInterpoler.hpp>
 
+#include <language/utils/InterpolateItemArray.hpp>
 #include <scheme/DiscreteFunctionP0Vector.hpp>
 #include <utils/Exceptions.hpp>
 
@@ -8,7 +9,14 @@ std::shared_ptr<IDiscreteFunction>
 DiscreteFunctionVectorInterpoler::_interpolate() const
 {
   std::shared_ptr mesh = std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(m_mesh);
-  return std::make_shared<DiscreteFunctionP0Vector<Dimension, DataType>>(mesh, m_function_id_list);
+
+  using MeshDataType      = MeshData<Dimension>;
+  MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(*mesh);
+
+  return std::make_shared<
+    DiscreteFunctionP0Vector<Dimension, DataType>>(mesh, InterpolateItemArray<DataType(TinyVector<Dimension>)>::
+                                                           template interpolate<ItemType::cell>(m_function_id_list,
+                                                                                                mesh_data.xj()));
 }
 
 template <size_t Dimension>