diff --git a/Device/Mask/Rectangle.cpp b/Device/Mask/Rectangle.cpp
index c457cf453e667d1fa3ea06668a65748398634e22..73ed150db205af2658a97ba4df56be9fbc8565bc 100644
--- a/Device/Mask/Rectangle.cpp
+++ b/Device/Mask/Rectangle.cpp
@@ -19,7 +19,8 @@
 //! @param ylow y-coordinate of lower left corner
 //! @param xup x-coordinate of upper right corner
 //! @param yup y-coordinate of upper right corner
-Rectangle::Rectangle(double xlow, double ylow, double xup, double yup) : IShape2D("Rectangle")
+Rectangle::Rectangle(double xlow, double ylow, double xup, double yup, bool inverted)
+    : IShape2D("Rectangle"), m_inverted(inverted)
 {
     if (xup <= xlow) {
         std::ostringstream message;
@@ -39,9 +40,15 @@ Rectangle::Rectangle(double xlow, double ylow, double xup, double yup) : IShape2
     m_yup = yup;
 }
 
+void Rectangle::setInverted(bool inverted /*= true*/)
+{
+    m_inverted = inverted;
+}
+
 bool Rectangle::contains(double x, double y) const
 {
-    return x <= m_xup && x >= m_xlow && y <= m_yup && y >= m_ylow;
+    const bool inRect = x <= m_xup && x >= m_xlow && y <= m_yup && y >= m_ylow;
+    return m_inverted ? !inRect : inRect;
 }
 
 bool Rectangle::contains(const Bin1D& binx, const Bin1D& biny) const
diff --git a/Device/Mask/Rectangle.h b/Device/Mask/Rectangle.h
index bf7b4da4af4349593d4bcae31ae3bc73665343d0..0140c3444b32c4f494829f657ac70a83bc047959 100644
--- a/Device/Mask/Rectangle.h
+++ b/Device/Mask/Rectangle.h
@@ -24,8 +24,10 @@
 
 class Rectangle : public IShape2D {
 public:
-    Rectangle(double xlow, double ylow, double xup, double yup);
-    Rectangle* clone() const { return new Rectangle(m_xlow, m_ylow, m_xup, m_yup); }
+    Rectangle(double xlow, double ylow, double xup, double yup, bool inverted = false);
+    Rectangle* clone() const { return new Rectangle(m_xlow, m_ylow, m_xup, m_yup, m_inverted); }
+
+    void setInverted(bool inverted = true);
 
     bool contains(double x, double y) const;
     bool contains(const Bin1D& binx, const Bin1D& biny) const;
@@ -39,6 +41,7 @@ public:
 
 private:
     double m_xlow, m_ylow, m_xup, m_yup;
+    bool m_inverted;
 };
 
 #endif // BORNAGAIN_DEVICE_MASK_RECTANGLE_H
diff --git a/Tests/UnitTests/Core/Mask/Shape2DTest.cpp b/Tests/UnitTests/Core/Mask/Shape2DTest.cpp
index 7213291b2249baa7be25083e596f803505bbab31..6037f7be5e03d5f2f4fe4836d7eae1c129a45891 100644
--- a/Tests/UnitTests/Core/Mask/Shape2DTest.cpp
+++ b/Tests/UnitTests/Core/Mask/Shape2DTest.cpp
@@ -41,6 +41,37 @@ TEST_F(Shape2DTest, Rectangle)
     EXPECT_FALSE(clone->contains(binx2, biny2));
 }
 
+TEST_F(Shape2DTest, Rectangle_inverted)
+{
+    Rectangle rect(-4.0, -2.0, 4.0, 2.0, true);
+    EXPECT_DOUBLE_EQ(32.0, rect.getArea());
+    EXPECT_FALSE(rect.contains(0.0, 0.0));
+    EXPECT_FALSE(rect.contains(4.0, 2.0));
+    EXPECT_FALSE(rect.contains(-4.0, -2.0));
+    EXPECT_FALSE(rect.contains(-4.0, -2.0));
+    EXPECT_TRUE(rect.contains(0.0, 2.01));
+    EXPECT_TRUE(rect.contains(4.0, -2.01));
+
+    Bin1D binx1(3.5, 4.5);
+    Bin1D biny1(1.5, 2.5);
+    EXPECT_FALSE(rect.contains(binx1, biny1));
+
+    Bin1D binx2(3.5, 4.6);
+    Bin1D biny2(1.5, 2.6);
+    EXPECT_TRUE(rect.contains(binx2, biny2));
+
+    std::unique_ptr<Rectangle> clone(rect.clone());
+    EXPECT_DOUBLE_EQ(32.0, clone->getArea());
+    EXPECT_FALSE(clone->contains(0.0, 0.0));
+    EXPECT_FALSE(clone->contains(4.0, 2.0));
+    EXPECT_FALSE(clone->contains(-4.0, -2.0));
+    EXPECT_FALSE(clone->contains(-4.0, -2.0));
+    EXPECT_TRUE(clone->contains(0.0, 2.01));
+    EXPECT_TRUE(clone->contains(4.0, -2.01));
+    EXPECT_FALSE(clone->contains(binx1, biny1));
+    EXPECT_TRUE(clone->contains(binx2, biny2));
+}
+
 TEST_F(Shape2DTest, Ellipse)
 {
     Ellipse ellipse(10.0, 1.0, 8.0, 4.0);