diff --git a/Core/Export/MaterialKeyHandler.cpp b/Core/Export/MaterialKeyHandler.cpp
index 11d3c15c4cce554bfca7ad59278347022034de9c..75a7524b013b10fa472f419c61a0176fdfa1506a 100644
--- a/Core/Export/MaterialKeyHandler.cpp
+++ b/Core/Export/MaterialKeyHandler.cpp
@@ -13,30 +13,32 @@
 //  ************************************************************************************************
 
 #include "Core/Export/MaterialKeyHandler.h"
+#include "Base/Utils/Assert.h"
 #include "Sample/Material/Material.h"
 #include <algorithm>
 #include <set>
 #include <stdexcept>
 
-std::string MaterialKeyHandler::mat2key(const Material* mat) const {
-    return m_MatMap.at(mat);
-}
-
-std::map<const std::string, const Material*> MaterialKeyHandler::materialMap() const {
-    return {};
-}
-
 void MaterialKeyHandler::insertMaterial(const Material* mat) {
-    for (const auto& it: m_MatMap)
+    for (const auto& it: m_Mat2Unique)
         if (*it.first == *mat) {
-            m_MatMap.emplace(mat, it.second);
+            m_Mat2Unique.emplace(mat, it.first);
             return;
         }
-    // material not found => create new key
-    std::set<std::string> unique_keys;
-    for (const auto& it: m_MatMap)
-        unique_keys.insert(it.second);
+    m_Mat2Unique.emplace(mat, mat);
+
+    const std::string key = "material_" + std::to_string(m_Key2Mat.size() + 1);
+    m_Key2Mat.emplace(key, mat);
+}
+
+const std::string& MaterialKeyHandler::mat2key(const Material* mat) const {
+    const Material* unique_mat = m_Mat2Unique.at(mat);
+    for (const auto& it: m_Key2Mat)
+        if (it.second == unique_mat)
+            return it.first;
+    ASSERT(0);
+}
 
-    const std::string key = "material_" + std::to_string(unique_keys.size() + 1);
-    m_MatMap.emplace(mat, key);
+const std::map<const std::string, const Material*>& MaterialKeyHandler::materialMap() const {
+    return m_Key2Mat;
 }
diff --git a/Core/Export/MaterialKeyHandler.h b/Core/Export/MaterialKeyHandler.h
index b14070e9732b6a4c733eb4dae1709ee13a7e8e39..cfc83193f04c18931ed0ae26b10ccfedcfcf252f 100644
--- a/Core/Export/MaterialKeyHandler.h
+++ b/Core/Export/MaterialKeyHandler.h
@@ -26,12 +26,14 @@ class Material;
 
 class MaterialKeyHandler {
 public:
-    std::map<const std::string, const Material*> materialMap() const;
-    std::string mat2key(const Material* sample) const;
     void insertMaterial(const Material* sample);
 
+    const std::map<const std::string, const Material*>& materialMap() const;
+    const std::string& mat2key(const Material* sample) const;
+
 private:
-    std::map<const Material*, const std::string> m_MatMap;
+    std::map<const Material*, const Material*> m_Mat2Unique;
+    std::map<const std::string, const Material*> m_Key2Mat;
 };
 
 #endif // BORNAGAIN_CORE_EXPORT_MATERIALKEYHANDLER_H
diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i
index 8c727f79c2c9e04deb1a007841a4891660a99fa4..5e359576a199fb9233b37ca7b05e17dae16ab508 100644
--- a/auto/Wrap/doxygenCore.i
+++ b/auto/Wrap/doxygenCore.i
@@ -1226,13 +1226,13 @@ Stores Material instances, associates them with given tag, and provides unique k
 C++ includes: MaterialKeyHandler.h
 ";
 
-%feature("docstring")  MaterialKeyHandler::materialMap "std::map< const std::string, const Material * > MaterialKeyHandler::materialMap() const
+%feature("docstring")  MaterialKeyHandler::insertMaterial "void MaterialKeyHandler::insertMaterial(const Material *sample)
 ";
 
-%feature("docstring")  MaterialKeyHandler::mat2key "std::string MaterialKeyHandler::mat2key(const Material *sample) const
+%feature("docstring")  MaterialKeyHandler::materialMap "const std::map< const std::string, const Material * > & MaterialKeyHandler::materialMap() const
 ";
 
-%feature("docstring")  MaterialKeyHandler::insertMaterial "void MaterialKeyHandler::insertMaterial(const Material *sample)
+%feature("docstring")  MaterialKeyHandler::mat2key "const std::string & MaterialKeyHandler::mat2key(const Material *sample) const
 ";