diff --git a/Core/Multilayer/MatrixFresnelMap.cpp b/Core/Multilayer/MatrixFresnelMap.cpp
index 2b30c4716f316cecf50623466148bad015719754..76f8e12b1727299976a40650a8435a458c7f3961 100644
--- a/Core/Multilayer/MatrixFresnelMap.cpp
+++ b/Core/Multilayer/MatrixFresnelMap.cpp
@@ -21,23 +21,44 @@
 #include "SpecularMagnetic.h"
 
 MatrixFresnelMap::MatrixFresnelMap(const MultiLayer* p_multilayer,
-                                             const MultiLayer* p_inverted_multilayer)
+                                   const MultiLayer* p_inverted_multilayer)
     : mp_multilayer(p_multilayer)
     , mp_inverted_multilayer(p_inverted_multilayer)
 {}
 
+MatrixFresnelMap::~MatrixFresnelMap()
+{}
+
 const ILayerRTCoefficients* MatrixFresnelMap::getOutCoefficients(
         const SimulationElement& sim_element, size_t layer_index) const
 {
-    std::vector<MatrixRTCoefficients> coeffs;
-    SpecularMagnetic::execute(*mp_inverted_multilayer, -sim_element.getMeanKf(), coeffs);
-    return new MatrixRTCoefficients(coeffs[layer_index]);
+    MatrixRTCoefficients* result;
+    kvector_t kvec = -sim_element.getMeanKf();
+    auto it = m_hash_table_out.find(kvec);
+    if (it != m_hash_table_out.end())
+        result = new MatrixRTCoefficients(it->second[layer_index]);
+    else {
+        std::vector<MatrixRTCoefficients> coeffs;
+        SpecularMagnetic::execute(*mp_inverted_multilayer, kvec, coeffs);
+        result = new MatrixRTCoefficients(coeffs[layer_index]);
+        m_hash_table_out[kvec] = std::move(coeffs);
+    }
+    return result;
 }
 
 const ILayerRTCoefficients* MatrixFresnelMap::getInCoefficients(
         const SimulationElement& sim_element, size_t layer_index) const
 {
-    std::vector<MatrixRTCoefficients> coeffs;
-    SpecularMagnetic::execute(*mp_multilayer, sim_element.getKi(), coeffs);
-    return new MatrixRTCoefficients(coeffs[layer_index]);
+    MatrixRTCoefficients* result;
+    kvector_t kvec = sim_element.getKi();
+    auto it = m_hash_table_in.find(kvec);
+    if (it != m_hash_table_in.end())
+        result = new MatrixRTCoefficients(it->second[layer_index]);
+    else {
+        std::vector<MatrixRTCoefficients> coeffs;
+        SpecularMagnetic::execute(*mp_multilayer, kvec, coeffs);
+        result = new MatrixRTCoefficients(coeffs[layer_index]);
+        m_hash_table_in[kvec] = std::move(coeffs);
+    }
+    return result;
 }
diff --git a/Core/Multilayer/MatrixFresnelMap.h b/Core/Multilayer/MatrixFresnelMap.h
index c3c8189c26cafe8e673b5727aadce5969da2d83e..dada248147b26e4143a9dbb12c9022f5fbbb4b44 100644
--- a/Core/Multilayer/MatrixFresnelMap.h
+++ b/Core/Multilayer/MatrixFresnelMap.h
@@ -16,10 +16,13 @@
 #ifndef MATRIXFRESNELMAP_H
 #define MATRIXFRESNELMAP_H
 
+#include "HashKVector.h"
 #include "IFresnelMap.h"
-#include <cstddef>
+#include <unordered_map>
+#include <vector>
 
 class ILayerRTCoefficients;
+class MatrixRTCoefficients;
 class MultiLayer;
 class SimulationElement;
 
@@ -30,7 +33,7 @@ class BA_CORE_API_ MatrixFresnelMap : public IFresnelMap
 {
 public:
     MatrixFresnelMap(const MultiLayer* p_multilayer, const MultiLayer* p_inverted_multilayer);
-    ~MatrixFresnelMap() final {}
+    ~MatrixFresnelMap() final;
 
     //! Retrieves the amplitude coefficients for the given angles
     const ILayerRTCoefficients* getOutCoefficients(
@@ -43,6 +46,10 @@ public:
 private:
     const MultiLayer* mp_multilayer;
     const MultiLayer* mp_inverted_multilayer;
+    mutable std::unordered_map<kvector_t, std::vector<MatrixRTCoefficients>,
+                               HashKVector> m_hash_table_out;
+    mutable std::unordered_map<kvector_t, std::vector<MatrixRTCoefficients>,
+                               HashKVector> m_hash_table_in;
 };
 
 #endif // MATRIXFRESNELMAP_H
diff --git a/Core/Multilayer/ScalarFresnelMap.h b/Core/Multilayer/ScalarFresnelMap.h
index fd3b7e1e2905a36413b730f66dc22d5c87eac3b4..db8619f4e476401f5a333e82c65cbf7008f4b0ab 100644
--- a/Core/Multilayer/ScalarFresnelMap.h
+++ b/Core/Multilayer/ScalarFresnelMap.h
@@ -21,8 +21,8 @@
 #include <unordered_map>
 #include <vector>
 
-class MultiLayer;
 class ILayerRTCoefficients;
+class MultiLayer;
 class ScalarRTCoefficients;
 class SimulationElement;