diff --git a/Core/Algorithms/inc/Mask.h b/Core/Algorithms/inc/Mask.h
new file mode 100644
index 0000000000000000000000000000000000000000..4ea92419ba62c7876f437f9f2ced66ebde9799b0
--- /dev/null
+++ b/Core/Algorithms/inc/Mask.h
@@ -0,0 +1,60 @@
+#ifndef MASK_H_
+#define MASK_H_
+#include <cstddef>
+// ********************************************************************
+// * The BornAgain project                                            *
+// * Simulation of neutron and x-ray scattering at grazing incidence  *
+// *                                                                  *
+// * LICENSE AND DISCLAIMER                                           *
+// * Lorem ipsum dolor sit amet, consectetur adipiscing elit.  Mauris *
+// * eget quam orci. Quisque  porta  varius  dui,  quis  posuere nibh *
+// * mollis quis. Mauris commodo rhoncus porttitor.                   *
+// ********************************************************************
+//! @file   Mask.h
+//! @brief  Definition of mask classes for OutputData masking
+//! @author Scientific Computing Group at FRM II
+//! @date   Nov 15, 2012
+
+//- -------------------------------------------------------------------
+//! @class Mask
+//! @brief Definition of base class for masking OutputData elements
+//- -------------------------------------------------------------------
+class Mask
+{
+public:
+    Mask(Mask *p_submask=0);
+    virtual ~Mask() { delete mp_submask; }
+    virtual Mask *clone() const;
+
+    size_t getFirstValidIndex();
+    size_t getNextIndex(size_t total_index);
+    void setMaxIndex(size_t max_index);
+
+protected:
+    virtual bool isMasked(size_t total_index) const;
+    size_t m_mask_index;
+    size_t m_end_index;
+    Mask *mp_submask;
+private:
+    size_t nextSubIndex(size_t total_index);
+};
+
+//- -------------------------------------------------------------------
+//! @class MaskIndexModulus
+//! @brief Mask based on the index modulo a given number
+//- -------------------------------------------------------------------
+class MaskIndexModulus : public Mask
+{
+public:
+    MaskIndexModulus(size_t modulus, size_t remainder, Mask *p_submask=0)
+        : Mask(p_submask), m_modulus(modulus), m_remainder(remainder) {}
+    virtual ~MaskIndexModulus() {}
+    virtual MaskIndexModulus *clone() const;
+
+private:
+    virtual bool isMasked(size_t total_index) const;
+    size_t m_modulus;
+    size_t m_remainder;
+};
+
+#endif /* MASK_H_ */
diff --git a/Core/Algorithms/src/Mask.cpp b/Core/Algorithms/src/Mask.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..18b44fd482cf055896798175578910503832efa7
--- /dev/null
+++ b/Core/Algorithms/src/Mask.cpp
@@ -0,0 +1,80 @@
+#include "Mask.h"
+
+Mask::Mask(Mask* p_submask)
+: m_mask_index(0), m_end_index(0), mp_submask(p_submask)
+{
+}
+
+Mask* Mask::clone() const
+{
+    Mask *p_new_submask = mp_submask ? mp_submask->clone() : 0;
+    Mask *p_new = new Mask(p_new_submask);
+    p_new->m_mask_index = m_mask_index;
+    p_new->setMaxIndex(m_end_index);
+    return p_new;
+}
+
+size_t Mask::getFirstValidIndex()
+{
+    m_mask_index = 0;
+    size_t result = 0;
+    if (mp_submask) result = mp_submask->getFirstValidIndex();
+    while (isMasked(result)) {
+        result = nextSubIndex(result);
+        if (result >= m_end_index) {
+            return m_end_index;
+        }
+    }
+    return result;
+}
+
+size_t Mask::getNextIndex(size_t total_index)
+{
+    size_t result = nextSubIndex(total_index);
+    while (isMasked(result)) {
+        result = nextSubIndex(result);
+        if (result >= m_end_index) {
+            return m_end_index;
+        }
+    }
+    return result;
+}
+
+void Mask::setMaxIndex(size_t max_index)
+{
+    m_end_index = max_index;
+    if (mp_submask) mp_submask->setMaxIndex(max_index);
+}
+
+bool Mask::isMasked(size_t total_index) const
+{
+    (void)total_index;
+    return false;
+}
+
+size_t Mask::nextSubIndex(size_t total_index)
+{
+    size_t result=0;
+    if (!mp_submask) {
+        result = total_index+1;
+    }
+    else {
+        result = mp_submask->getNextIndex(total_index);
+    }
+    ++m_mask_index;
+    return result;
+}
+
+MaskIndexModulus* MaskIndexModulus::clone() const
+{
+    Mask *p_new_submask = mp_submask ? mp_submask->clone() : 0;
+    MaskIndexModulus *p_new = new MaskIndexModulus(m_modulus, m_remainder, p_new_submask);
+    p_new->m_mask_index = m_mask_index;
+    p_new->setMaxIndex(m_end_index);
+    return p_new;
+}
+
+bool MaskIndexModulus::isMasked(size_t total_index) const
+{
+    return m_mask_index % m_modulus == m_remainder;
+}
diff --git a/Core/Core.pro b/Core/Core.pro
index 2d105eb1786d23a64f67a78ebd45a069337b2c05..9dda300728bb6e31f8372462700e6ed789f91685 100644
--- a/Core/Core.pro
+++ b/Core/Core.pro
@@ -34,6 +34,7 @@ SOURCES += \
     Algorithms/src/LayerDecoratorDWBASimulation.cpp \
     Algorithms/src/LayerDWBASimulation.cpp \
     Algorithms/src/LocalMonodisperseApproximationStrategy.cpp \
+    Algorithms/src/Mask.cpp \
     Algorithms/src/MultiLayerDWBASimulation.cpp \
     Algorithms/src/MultiLayerRoughnessDWBASimulation.cpp \
     Algorithms/src/OpticalFresnel.cpp \
@@ -143,6 +144,7 @@ HEADERS += \
     Algorithms/inc/LayerDecoratorDWBASimulation.h \
     Algorithms/inc/LayerDWBASimulation.h \
     Algorithms/inc/LocalMonodisperseApproximationStrategy.h \
+    Algorithms/inc/Mask.h \
     Algorithms/inc/MultiLayerDWBASimulation.h \
     Algorithms/inc/MultiLayerRoughnessDWBASimulation.h \
     Algorithms/inc/OpticalFresnel.h \