diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
index ff56013ff93d07e7d41e5466a9195679fb239165..e7c0af359707e9bdf39696ccd31c9796c8d78d3f 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
+++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
@@ -174,6 +174,35 @@ void ComponentTransportProcess::
         _local_assemblers, pv.getActiveElementIDs(), _coupled_solutions);
 }
 
+void ComponentTransportProcess::extrapolateIntegrationPointValuesToNodes(
+    const double t,
+    std::vector<GlobalVector*> const& integration_point_values_vectors,
+    std::vector<GlobalVector*>& nodal_values_vectors)
+{
+    auto& extrapolator = getExtrapolator();
+    auto const extrapolatables =
+        NumLib::makeExtrapolatable(_local_assemblers,
+                                   &ComponentTransportLocalAssemblerInterface::
+                                       getInterpolatedLocalSolution);
+
+    for (unsigned transport_process_id = 0;
+         transport_process_id < integration_point_values_vectors.size();
+         ++transport_process_id)
+    {
+        auto const& pv = _process_variables[transport_process_id + 1][0].get();
+        auto const& int_pt_C =
+            integration_point_values_vectors[transport_process_id];
+
+        extrapolator.extrapolate(pv.getNumberOfComponents(), extrapolatables, t,
+                                 {int_pt_C},
+                                 {_local_to_global_index_map.get()});
+
+        auto const& nodal_values = extrapolator.getNodalValues();
+        MathLib::LinAlg::copy(nodal_values,
+                              *nodal_values_vectors[transport_process_id + 1]);
+    }
+}
+
 void ComponentTransportProcess::preTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, const double /*t*/,
     const double /*delta_t*/, int const process_id)
diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.h b/ProcessLib/ComponentTransport/ComponentTransportProcess.h
index 8b5f300935f5723185844a75d33d80b34413e79d..374f771f5e707e6c4081df10e56fc146cdb3979b 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportProcess.h
+++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.h
@@ -117,6 +117,11 @@ public:
     void setCoupledTermForTheStaggeredSchemeToLocalAssemblers(
         int const process_id) override;
 
+    void extrapolateIntegrationPointValuesToNodes(
+        const double t,
+        std::vector<GlobalVector*> const& integration_point_values_vectors,
+        std::vector<GlobalVector*>& nodal_values_vectors) override;
+
     void preTimestepConcreteProcess(std::vector<GlobalVector*> const& x,
                                     const double /*t*/,
                                     const double /*delta_t*/,
diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h
index 5d5d92e32758fc7ccb849c12f2c1b1081c9b8d08..5838c56e19ccc3c7575ca91667f8f33ce84b3045 100644
--- a/ProcessLib/Process.h
+++ b/ProcessLib/Process.h
@@ -100,6 +100,14 @@ public:
         int const /*process_id*/)
     {
     }
+
+    virtual void extrapolateIntegrationPointValuesToNodes(
+        const double /*t*/,
+        std::vector<GlobalVector*> const& /*integration_point_values_vectors*/,
+        std::vector<GlobalVector*>& /*nodal_values_vectors*/)
+    {
+    }
+
     void preAssemble(const double t, double const dt,
                      GlobalVector const& x) final;
     void assemble(const double t, double const dt,