diff --git a/Device/Detector/IDetector2D.cpp b/Device/Detector/IDetector2D.cpp
index 35b074e3a210f4263e5a474de6aff9ff922083e2..b307ceecf6916f45480085b0f0e442c29351c6c7 100644
--- a/Device/Detector/IDetector2D.cpp
+++ b/Device/Detector/IDetector2D.cpp
@@ -14,11 +14,13 @@
 
 #include "Device/Detector/IDetector2D.h"
 #include "Base/Const/Units.h"
+#include "Base/Axis/IAxis.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Detector/DetectorContext.h"
 #include "Device/Mask/DetectorMask.h"
 #include "Device/Mask/InfinitePlane.h"
 #include "Resample/Element/DiffuseElement.h"
+#include "Base/Util/Assert.h"
 
 namespace {
 
diff --git a/Device/Mask/DetectorMask.cpp b/Device/Mask/DetectorMask.cpp
index 4dd25500440da79a4a69c100ed47a127dc4b129b..17fba6427aab546f78f107acc3a470b5e5239470 100644
--- a/Device/Mask/DetectorMask.cpp
+++ b/Device/Mask/DetectorMask.cpp
@@ -17,6 +17,7 @@
 #include "Device/Histo/Histogram2D.h"
 #include "Device/Mask/IShape2D.h"
 #include "Base/Types/ICloneable.h"
+#include "Device/Data/Powerfield.h"
 
 class MaskPattern : public ICloneable {
 public:
@@ -29,16 +30,20 @@ public:
 
 
 DetectorMask::DetectorMask()
-    : m_number_of_masked_channels(0)
+    : m_masked(new Powerfield<bool>)
+    , m_number_of_masked_channels(0)
 {
 }
 
 DetectorMask::DetectorMask(const IAxis& xAxis, const IAxis& yAxis)
+    : DetectorMask()
 {
-    m_masked.clear();
+    m_masked->clear();
 
-    m_masked.addAxis(xAxis);
-    m_masked.addAxis(yAxis);
+    m_masked->addAxis(xAxis);
+    m_masked->addAxis(yAxis);
+
+//    m_masked.reset(new Powerfield<bool>(xAxis, yAxis));
 
     process_masks();
 }
@@ -47,16 +52,17 @@ DetectorMask::~DetectorMask() = default;
 
 DetectorMask::DetectorMask(const DetectorMask& other)
     : m_stack(other.m_stack)
+    , m_masked(other.m_masked->clone())
     , m_number_of_masked_channels(other.m_number_of_masked_channels)
 {
-    m_masked.copyFrom(other.m_masked);
+    m_masked->copyFrom(*other.m_masked);
 }
 
 DetectorMask& DetectorMask::operator=(const DetectorMask& other)
 {
     if (this != &other) {
         m_stack = other.m_stack;
-        m_masked.copyFrom(other.m_masked);
+        m_masked.reset(other.m_masked->clone());
         m_number_of_masked_channels = other.m_number_of_masked_channels;
     }
     return *this;
@@ -65,31 +71,31 @@ DetectorMask& DetectorMask::operator=(const DetectorMask& other)
 void DetectorMask::addMask(const IShape2D& shape, bool mask_value)
 {
     m_stack.emplace_back(new MaskPattern(shape.clone(), mask_value));
-    m_masked.clear();
+    m_masked->clear();
     m_number_of_masked_channels = 0;
 }
 
 void DetectorMask::initMaskData(const IAxis& xAxis, const IAxis& yAxis)
 {
-    m_masked.clear();
+    m_masked->clear();
 
-    m_masked.addAxis(xAxis);
-    m_masked.addAxis(yAxis);
+    m_masked->addAxis(xAxis);
+    m_masked->addAxis(yAxis);
 
     process_masks();
 }
 
 bool DetectorMask::isMasked(size_t index) const
 {
-    return m_number_of_masked_channels == 0 ? false : m_masked[index];
+    return m_number_of_masked_channels == 0 ? false : (*m_masked)[index];
 }
 
 Histogram2D* DetectorMask::createHistogram() const
 {
     Powerfield<double> data;
-    data.copyShapeFrom(m_masked);
-    for (size_t i = 0; i < m_masked.getAllocatedSize(); ++i)
-        data[i] = static_cast<double>(m_masked[i]);
+    data.copyShapeFrom(*m_masked);
+    for (size_t i = 0; i < m_masked->getAllocatedSize(); ++i)
+        data[i] = static_cast<double>((*m_masked)[i]);
     return dynamic_cast<Histogram2D*>(IHistogram::createHistogram(data));
 }
 
@@ -113,14 +119,14 @@ const IShape2D* DetectorMask::getMaskShape(size_t mask_index, bool& mask_value)
 
 void DetectorMask::process_masks()
 {
-    m_masked.setAllTo(false);
+    m_masked->setAllTo(false);
     if (!!m_stack.empty())
         return;
 
     m_number_of_masked_channels = 0;
-    for (size_t index = 0; index < m_masked.getAllocatedSize(); ++index) {
-        Bin1D binx = m_masked.getAxisBin(index, 0);
-        Bin1D biny = m_masked.getAxisBin(index, 1);
+    for (size_t index = 0; index < m_masked->getAllocatedSize(); ++index) {
+        Bin1D binx = m_masked->getAxisBin(index, 0);
+        Bin1D biny = m_masked->getAxisBin(index, 1);
         // setting mask to the data starting from last shape added
         bool is_masked(false);
         for (size_t k = m_stack.size(); k > 0; --k) {
@@ -128,7 +134,7 @@ void DetectorMask::process_masks()
             if (pat->shape->contains(binx, biny)) {
                 if (pat->doMask)
                     is_masked = true;
-                m_masked[index] = pat->doMask;
+                (*m_masked)[index] = pat->doMask;
                 break; // index is covered by the shape, stop looking further
             }
         }
diff --git a/Device/Mask/DetectorMask.h b/Device/Mask/DetectorMask.h
index a0b1822131855684b08671f087feee64e88360fd..014cabc64dc9357e8f8c0e080febd8c3ce5fb1e8 100644
--- a/Device/Mask/DetectorMask.h
+++ b/Device/Mask/DetectorMask.h
@@ -15,7 +15,8 @@
 #ifndef BORNAGAIN_DEVICE_MASK_DETECTORMASK_H
 #define BORNAGAIN_DEVICE_MASK_DETECTORMASK_H
 
-#include "Device/Data/Powerfield.h"
+#include <memory>
+
 #ifndef SWIG
 #include "Base/Types/OwningVector.h"
 #endif
@@ -50,7 +51,7 @@ public:
 
     bool isMasked(size_t index) const;
 
-    const Powerfield<bool>* getMaskData() const { return &m_masked; }
+    const Powerfield<bool>* getMaskData() const { return m_masked.get(); }
 
     Histogram2D* createHistogram() const;
 
@@ -72,7 +73,7 @@ private:
 #endif
 
     // cached secondary data:
-    Powerfield<bool> m_masked;
+    std::unique_ptr<Powerfield<bool>> m_masked;
     int m_number_of_masked_channels;
 };
 
diff --git a/Tests/Unit/Device/DetectorMaskTest.cpp b/Tests/Unit/Device/DetectorMaskTest.cpp
index 25c7b4bf4b1800fbbf0a271e84b25daf3b170f19..540de4a0724f45f895051e250ea03199d61a8515 100644
--- a/Tests/Unit/Device/DetectorMaskTest.cpp
+++ b/Tests/Unit/Device/DetectorMaskTest.cpp
@@ -2,6 +2,7 @@
 #include "Device/Detector/SphericalDetector.h"
 #include "Device/Mask/Polygon.h"
 #include "Tests/GTestWrapper/google_test.h"
+#include "Device/Data/Powerfield.h"
 #include <memory>
 
 class DetectorMaskTest : public ::testing::Test {