diff --git a/Core/Multilayer/IFresnelMap.h b/Core/Multilayer/IFresnelMap.h
index b5f4a505615488d35fadd56bfdd8075c1a086b5e..46642dfe53c587022732e4c7e87e60b100c079c2 100644
--- a/Core/Multilayer/IFresnelMap.h
+++ b/Core/Multilayer/IFresnelMap.h
@@ -22,6 +22,7 @@
 class ILayerRTCoefficients;
 class MultiLayer;
 class SimulationElement;
+class SpecularSimulationElement;
 
 //! Holds the necessary information to calculate the radiation wavefunction in every layer
 //! for different incoming (outgoing) angles of the beam in the top layer
@@ -44,6 +45,7 @@ public:
 
     //! Fills simulation element specular data
     virtual void fillSpecularData(SimulationElement& sim_element) const = 0;
+    virtual void fillSpecularData(SpecularSimulationElement& sim_element) const = 0;
 
     //! Sets the multilayer to be used for the Fresnel calculations.
     virtual void setMultilayer(const MultiLayer& multilayer);
diff --git a/Core/Multilayer/MatrixFresnelMap.cpp b/Core/Multilayer/MatrixFresnelMap.cpp
index d65a4cf3515a4a605010ce380a29043de2def034..37fc2181bb81ad3274bf2eead1b72e5d0f21b8da 100644
--- a/Core/Multilayer/MatrixFresnelMap.cpp
+++ b/Core/Multilayer/MatrixFresnelMap.cpp
@@ -19,6 +19,7 @@
 #include "SimulationElement.h"
 #include "SpecularData.h"
 #include "SpecularMagnetic.h"
+#include "SpecularSimulationElement.h"
 
 namespace {
 std::vector<MatrixRTCoefficients> calculateCoefficients(const MultiLayer& multilayer,
@@ -57,6 +58,17 @@ void MatrixFresnelMap::fillSpecularData(SimulationElement& sim_element) const
     sim_element.setSpecular(std::make_unique<SpecularData>(std::move(coef_vector)));
 }
 
+void MatrixFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const
+{
+    const auto& kvec = sim_element.getKi();
+    std::vector<MatrixRTCoefficients> coef_vector;
+    if (m_use_cache)
+        coef_vector = getCoefficientsFromCache(kvec, *mP_multilayer, m_hash_table_in);
+    else
+        coef_vector = calculateCoefficients(*mP_multilayer, kvec);
+    sim_element.setSpecular(std::make_unique<SpecularData>(std::move(coef_vector)));
+}
+
 const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(kvector_t kvec, size_t layer_index,
                                                 const MultiLayer& multilayer,
                                                 CoefficientHash& hash_table) const
diff --git a/Core/Multilayer/MatrixFresnelMap.h b/Core/Multilayer/MatrixFresnelMap.h
index 957c9bb279c064738e4decb66040372df5fccaaf..32ee7fc63262f5e5f68f1348e6625d063572e95e 100644
--- a/Core/Multilayer/MatrixFresnelMap.h
+++ b/Core/Multilayer/MatrixFresnelMap.h
@@ -45,6 +45,7 @@ public:
 
     //! Fills simulation element specular data
     void fillSpecularData(SimulationElement& sim_element) const override;
+    void fillSpecularData(SpecularSimulationElement& sim_element) const override;
 
     typedef std::unordered_map<kvector_t, std::vector<MatrixRTCoefficients>, HashKVector>
         CoefficientHash;
diff --git a/Core/Multilayer/ScalarFresnelMap.cpp b/Core/Multilayer/ScalarFresnelMap.cpp
index c0fc86bebe7c1b30d08b5f3bc8f052cb054c95cb..f3e217cc44a7f53a66a3b664191caf0680dfd487 100644
--- a/Core/Multilayer/ScalarFresnelMap.cpp
+++ b/Core/Multilayer/ScalarFresnelMap.cpp
@@ -18,6 +18,7 @@
 #include "SimulationElement.h"
 #include "SpecularData.h"
 #include "SpecularMatrix.h"
+#include "SpecularSimulationElement.h"
 
 namespace {
 std::vector<ScalarRTCoefficients> calculateCoefficients(const MultiLayer& multilayer,
@@ -53,6 +54,17 @@ void ScalarFresnelMap::fillSpecularData(SimulationElement& sim_element) const
     sim_element.setSpecular(std::make_unique<SpecularData>(std::move(coef_vector)));
 }
 
+void ScalarFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const
+{
+    const auto& kvec = sim_element.getKi();
+    std::vector<ScalarRTCoefficients> coef_vector;
+    if (m_use_cache)
+        coef_vector = getCoefficientsFromCache(kvec);
+    else
+        coef_vector = calculateCoefficients(*mP_multilayer, kvec);
+    sim_element.setSpecular(std::make_unique<SpecularData>(std::move(coef_vector)));
+}
+
 const ScalarRTCoefficients* ScalarFresnelMap::getCoefficients(
         kvector_t kvec, size_t layer_index) const
 {
diff --git a/Core/Multilayer/ScalarFresnelMap.h b/Core/Multilayer/ScalarFresnelMap.h
index 74e7c58076d1b3648a61b0fff41028fd5da91e0f..bd0b7fcabcab81fb3642a6d1577b4943a8d0f987 100644
--- a/Core/Multilayer/ScalarFresnelMap.h
+++ b/Core/Multilayer/ScalarFresnelMap.h
@@ -45,6 +45,7 @@ public:
 
     //! Fills simulation element specular data
     void fillSpecularData(SimulationElement& sim_element) const override;
+    void fillSpecularData(SpecularSimulationElement& sim_element) const override;
 
 private:
     const ScalarRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index) const;