diff --git a/Core/Samples/inc/HomogeneousMaterial.h b/Core/Samples/inc/HomogeneousMaterial.h
index db967ba946f7ccafce38e22d67a1dbd344f942f6..c5c4b5b5eb663c7dec7046de5c077f662be14f43 100644
--- a/Core/Samples/inc/HomogeneousMaterial.h
+++ b/Core/Samples/inc/HomogeneousMaterial.h
@@ -47,9 +47,11 @@ public:
     void setRefractiveIndex(const complex_t &refractive_index)
     { m_refractive_index = refractive_index; }
 
+#ifndef GCCXML_SKIP_THIS
     //! Get the scattering matrix from the refractive index
     //! and a given wavevector
     virtual Eigen::Matrix2cd getScatteringMatrix(const kvector_t& k) const;
+#endif
 protected:
     virtual void print(std::ostream& ostr) const
     {
@@ -60,6 +62,7 @@ protected:
     complex_t m_refractive_index; //!< complex index of refraction
 };
 
+#ifndef GCCXML_SKIP_THIS
 inline Eigen::Matrix2cd HomogeneousMaterial::getScatteringMatrix(
         const kvector_t& k) const
 {
@@ -69,6 +72,7 @@ inline Eigen::Matrix2cd HomogeneousMaterial::getScatteringMatrix(
     result = unit_factor*Eigen::Matrix2cd::Identity();
     return result;
 }
+#endif
 
 #endif // HOMOGENEOUSMATERIAL_H
 
diff --git a/Core/Samples/inc/IMaterial.h b/Core/Samples/inc/IMaterial.h
index c30ac9254f4f449c14be4c3a182dfb4371a4fe3f..eb414eb182de396e4c9a7482374d7b30ac6bd5ba 100644
--- a/Core/Samples/inc/IMaterial.h
+++ b/Core/Samples/inc/IMaterial.h
@@ -21,7 +21,10 @@
 
 #include <string>
 #include <iostream>
+
+#ifndef GCCXML_SKIP_THIS
 #include <Eigen/Core>
+#endif
 
 //! Interface to a named material.
 
@@ -42,12 +45,14 @@ public:
     friend std::ostream &operator<<(std::ostream &ostr, const IMaterial &m)
     { m.print(ostr); return ostr; }
 
+#ifndef GCCXML_SKIP_THIS
     //! Get the scattering matrix from the refractive index
     //! and a given wavevector
     virtual Eigen::Matrix2cd getScatteringMatrix(const kvector_t& k) const {
         (void)k;
         return Eigen::Matrix2cd::Identity();
     }
+#endif
 
 protected:
     virtual void print(std::ostream& ostr) const
diff --git a/Core/Tools/inc/SampleMaterialVisitor.h b/Core/Tools/inc/SampleMaterialVisitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..a83dfd6b7db8edd2893c3055774f3717840c47ed
--- /dev/null
+++ b/Core/Tools/inc/SampleMaterialVisitor.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      SampleMaterialVisitor.h
+//! @brief     Defines class SampleMaterialVisitor.
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEMATERIALVISITOR_H_
+#define SAMPLEMATERIALVISITOR_H_
+
+#include "ISampleVisitor.h"
+#include "IMaterial.h"
+
+//! SampleMaterialVisitor retrieves a list of the used materials in a sample
+class SampleMaterialVisitor : public ISampleVisitor
+{
+public:
+    SampleMaterialVisitor();
+    virtual ~SampleMaterialVisitor();
+
+    void visit(const ISample *sample);
+    void visit(const MultiLayer *sample);
+    void visit(const Layer *sample);
+    void visit(const LayerInterface *sample);
+    void visit(const ParticleDecoration *sample);
+    void visit(const ParticleInfo *sample);
+    void visit(const Particle *sample);
+    void visit(const IFormFactor *sample);
+
+    void visit(const FormFactorFullSphere *sample);
+    void visit(const FormFactorPyramid *sample);
+    void visit(const FormFactorCylinder *sample);
+    void visit(const FormFactorPrism3 *sample);
+
+    void visit(const IInterferenceFunction *sample);
+    void visit(const InterferenceFunction1DParaCrystal  *);
+    void visit(const InterferenceFunction2DParaCrystal  *);
+
+    std::vector<const IMaterial *> getMaterials() const {
+        return m_materials;
+    }
+
+protected:
+    void addMaterial(const IMaterial *p_material);
+    std::vector<const IMaterial *> m_materials;
+};
+
+
+
+#endif /* SAMPLEMATERIALVISITOR_H_ */
diff --git a/Core/Tools/src/SampleMaterialVisitor.cpp b/Core/Tools/src/SampleMaterialVisitor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..821fe00bd6dcc7b5b7bc49d0e18b9be6560cc3f6
--- /dev/null
+++ b/Core/Tools/src/SampleMaterialVisitor.cpp
@@ -0,0 +1,144 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      SampleMaterialVisitor.cpp
+//! @brief     Implements class SampleMaterialVisitor.
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleMaterialVisitor.h"
+
+#include <algorithm>
+
+SampleMaterialVisitor::SampleMaterialVisitor()
+{
+    m_materials.clear();
+}
+
+SampleMaterialVisitor::~SampleMaterialVisitor()
+{
+    m_materials.clear();
+}
+
+void SampleMaterialVisitor::visit(const ISample* sample)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(ISample *)");
+}
+
+void SampleMaterialVisitor::visit(const MultiLayer* sample)
+{
+    assert(sample);
+
+    for(size_t i_layer=0; i_layer < sample->getNumberOfLayers(); ++i_layer) {
+        const Layer *layer = sample->getLayer(i_layer);
+        layer->accept(this);
+    }
+}
+
+void SampleMaterialVisitor::visit(const Layer* sample)
+{
+    assert(sample);
+
+    IMaterial *p_material = sample->getMaterial();
+    addMaterial(p_material);
+    const IDecoration *p_decoration = sample->getDecoration();
+    if (p_decoration) {
+        p_decoration->accept(this);
+    }
+}
+
+void SampleMaterialVisitor::visit(const LayerInterface* sample)
+{
+    throw NotImplementedException("SampleMaterialVisitor::visit(LayerInterface *)");
+}
+
+void SampleMaterialVisitor::visit(const ParticleDecoration* sample)
+{
+    assert(sample);
+
+    for (size_t i=0; i<sample->getNumberOfParticles(); ++i) {
+        const ParticleInfo *p_particle_info = sample->getParticleInfo(i);
+        p_particle_info->accept(this);
+    }
+}
+
+void SampleMaterialVisitor::visit(const ParticleInfo* sample)
+{
+    assert(sample);
+
+    const Particle *p_particle = sample->getParticle();
+    if (p_particle) {
+        p_particle->accept(this);
+    }
+}
+
+void SampleMaterialVisitor::visit(const Particle* sample)
+{
+    assert(sample);
+
+    const IMaterial *p_material = sample->getMaterial();
+    addMaterial(p_material);
+}
+
+void SampleMaterialVisitor::visit(const IFormFactor* sample)
+{
+    throw NotImplementedException("SampleMaterialVisitor::"
+            "visit(IFormFactor *)");
+}
+
+void SampleMaterialVisitor::visit(const FormFactorFullSphere* sample)
+{
+    throw NotImplementedException("SampleMaterialVisitor::"
+            "visit(FormFactorFullSphere *)");
+}
+
+void SampleMaterialVisitor::visit(const FormFactorPyramid* sample)
+{
+    throw NotImplementedException("SampleMaterialVisitor::"
+            "visit(FormFactorPyramid *)");
+}
+
+void SampleMaterialVisitor::visit(const FormFactorCylinder* sample)
+{
+    throw NotImplementedException("SampleMaterialVisitor::"
+            "visit(FormFactorCylinder *)");
+}
+
+void SampleMaterialVisitor::visit(const FormFactorPrism3* sample)
+{
+    throw NotImplementedException("SampleMaterialVisitor::"
+            "visit(FormFactorPrism3 *)");
+}
+
+void SampleMaterialVisitor::visit(const IInterferenceFunction* sample)
+{
+    throw NotImplementedException("SampleMaterialVisitor::"
+            "visit(IInterferenceFunction *)");
+}
+
+void SampleMaterialVisitor::visit(const InterferenceFunction1DParaCrystal*)
+{
+    throw NotImplementedException("SampleMaterialVisitor::"
+            "visit(IInterferenceFunction *)");
+}
+
+void SampleMaterialVisitor::visit(const InterferenceFunction2DParaCrystal*)
+{
+    throw NotImplementedException("SampleMaterialVisitor::"
+            "visit(InterferenceFunction2DParaCrystal *)");
+}
+
+void SampleMaterialVisitor::addMaterial(const IMaterial* p_material)
+{
+    if (std::find(m_materials.begin(), m_materials.end(), p_material) !=
+            m_materials.end() ) {
+        m_materials.push_back(p_material);
+    }
+}
diff --git a/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp b/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
index 49c7434262bb85436a4e6404c1e11bce904fd943..cc1268bc78231cc61397604fe68c83209a557e2d 100644
--- a/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
+++ b/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
@@ -13,8 +13,10 @@ using namespace FunctionalTests;
 
 
 MesoCrystal1::MesoCrystal1()
-    : m_name("MesoCrystal1")
-    , m_description("Meso crystal simulation")
+: m_name("MesoCrystal1")
+, m_description("Meso crystal simulation")
+, m_result(0)
+, m_reference(0)
 { }