diff --git a/Core/Instrument/RectangularDetector.cpp b/Core/Instrument/RectangularDetector.cpp
index 9494d9ffc59fa2298e6bdd1f5c028def29332ca2..93e969f9d84b32e5377142264bd97d8184bac9ac 100644
--- a/Core/Instrument/RectangularDetector.cpp
+++ b/Core/Instrument/RectangularDetector.cpp
@@ -16,6 +16,7 @@
 #include "Beam.h"
 #include "BornAgainNamespace.h"
 #include "IDetectorResolution.h"
+#include "RegionOfInterest.h"
 #include "SimulationElement.h"
 #include "MathConstants.h"
 #include "Units.h"
@@ -175,18 +176,29 @@ AxesUnits RectangularDetector::defaultAxesUnits() const
     return AxesUnits::MM;
 }
 
-RectangularPixel* RectangularDetector::toSinglePixel() const
+RectangularPixel* RectangularDetector::regionOfInterestPixel() const
 {
     const IAxis& u_axis = getAxis(BornAgain::X_AXIS_INDEX);
     const IAxis& v_axis = getAxis(BornAgain::Y_AXIS_INDEX);
-    double u_min = u_axis.getMin();
-    double v_min = v_axis.getMin();
+    double u_min, v_min, width, height;
+    auto p_roi = regionOfInterest();
+    if (p_roi) {
+        u_min = p_roi->getXlow();
+        v_min = p_roi->getYlow();
+        width = p_roi->getXup() - p_roi->getXlow();
+        height = p_roi->getYup() - p_roi->getYlow();
+    } else {
+        u_min = u_axis.getMin();
+        v_min = v_axis.getMin();
+        width = getWidth();
+        height = getHeight();
+    }
 
     const kvector_t corner_position(m_normal_to_detector + (u_min - m_u0) * m_u_unit
                                     + (v_min - m_v0) * m_v_unit);
-    const kvector_t width = getWidth() * m_u_unit;
-    const kvector_t height = getHeight() * m_v_unit;
-    return new RectangularPixel(corner_position, width, height);
+    const kvector_t uaxis_vector = width * m_u_unit;
+    const kvector_t vaxis_vector = height * m_v_unit;
+    return new RectangularPixel(corner_position, uaxis_vector, vaxis_vector);
 }
 
 IPixel* RectangularDetector::createPixel(size_t index) const
diff --git a/Core/Instrument/RectangularDetector.h b/Core/Instrument/RectangularDetector.h
index ac1ea9b010bfa7f9c8f112d3a3b027a2e6be6f0b..0cf04e82878733fdaf49b6e61aed3c244d2d4b2c 100644
--- a/Core/Instrument/RectangularDetector.h
+++ b/Core/Instrument/RectangularDetector.h
@@ -79,7 +79,7 @@ public:
     //! return default axes units
     AxesUnits defaultAxesUnits() const override;
 
-    RectangularPixel* toSinglePixel() const;
+    RectangularPixel* regionOfInterestPixel() const;
 
 protected:
     //! Create an IPixel for the given OutputData object and index
diff --git a/Core/Instrument/UnitConverters.cpp b/Core/Instrument/UnitConverters.cpp
index b006ce10c6b4776f3609da750c188ae11357552e..40d6a34e1b07d2d4e67564276653ab10eca5a76c 100644
--- a/Core/Instrument/UnitConverters.cpp
+++ b/Core/Instrument/UnitConverters.cpp
@@ -17,6 +17,7 @@
 #include "BornAgainNamespace.h"
 #include "MathConstants.h"
 #include "RectangularDetector.h"
+#include "RegionOfInterest.h"
 #include "SphericalDetector.h"
 #include "Units.h"
 
@@ -86,7 +87,14 @@ UnitConverterSimple::UnitConverterSimple(const UnitConverterSimple& other)
 void UnitConverterSimple::addDetectorAxis(const IDetector& detector, size_t i_axis)
 {
     auto& axis = detector.getAxis(i_axis);
-    addAxisData(axis.getName(), axis.getMin(), axis.getMax(), defaultUnits(), axis.size());
+    auto p_roi = detector.regionOfInterest();
+    if (p_roi) {
+        auto P_roi_axis = p_roi->clipAxisToRoi(i_axis, axis);
+        addAxisData(axis.getName(), P_roi_axis->getMin(), P_roi_axis->getMax(), defaultUnits(),
+                    P_roi_axis->size());
+    } else {
+        addAxisData(axis.getName(), axis.getMin(), axis.getMax(), defaultUnits(), axis.size());
+    }
 }
 
 void UnitConverterSimple::checkIndex(size_t i_axis) const
@@ -160,7 +168,7 @@ RectangularConverter::RectangularConverter(const RectangularDetector& detector,
                                  + std::to_string(static_cast<int>(detector.dimension())));
     addDetectorAxis(detector, 0);
     addDetectorAxis(detector, 1);
-    mP_detector_pixel.reset(detector.toSinglePixel());
+    mP_detector_pixel.reset(detector.regionOfInterestPixel());
 }
 
 RectangularConverter::~RectangularConverter() =default;
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index c26ff99222a7ebef6592cecc4f8ddcda7f714073..5e0407468649caebd51ec50f5e6a406b6c2caf35 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -26173,9 +26173,9 @@ class RectangularDetector(IDetector2D):
         return _libBornAgainCore.RectangularDetector_defaultAxesUnits(self)
 
 
-    def toSinglePixel(self):
-        """toSinglePixel(RectangularDetector self) -> RectangularPixel"""
-        return _libBornAgainCore.RectangularDetector_toSinglePixel(self)
+    def regionOfInterestPixel(self):
+        """regionOfInterestPixel(RectangularDetector self) -> RectangularPixel"""
+        return _libBornAgainCore.RectangularDetector_regionOfInterestPixel(self)
 
 RectangularDetector_swigregister = _libBornAgainCore.RectangularDetector_swigregister
 RectangularDetector_swigregister(RectangularDetector)
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 4fae02bd6af128d867a832e89d25d8f8985de843..4421b04a3cd5a01761d92538a8ebc254cf603567 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -109940,7 +109940,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_RectangularDetector_toSinglePixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RectangularDetector_regionOfInterestPixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   RectangularDetector *arg1 = (RectangularDetector *) 0 ;
   void *argp1 = 0 ;
@@ -109948,13 +109948,13 @@ SWIGINTERN PyObject *_wrap_RectangularDetector_toSinglePixel(PyObject *SWIGUNUSE
   PyObject * obj0 = 0 ;
   RectangularPixel *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_toSinglePixel",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_regionOfInterestPixel",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_toSinglePixel" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_regionOfInterestPixel" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
   }
   arg1 = reinterpret_cast< RectangularDetector * >(argp1);
-  result = (RectangularPixel *)((RectangularDetector const *)arg1)->toSinglePixel();
+  result = (RectangularPixel *)((RectangularDetector const *)arg1)->regionOfInterestPixel();
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularPixel, 0 |  0 );
   return resultobj;
 fail:
@@ -126470,7 +126470,7 @@ static PyMethodDef SwigMethods[] = {
 		"return default axes units \n"
 		"\n"
 		""},
-	 { (char *)"RectangularDetector_toSinglePixel", _wrap_RectangularDetector_toSinglePixel, METH_VARARGS, (char *)"RectangularDetector_toSinglePixel(RectangularDetector self) -> RectangularPixel"},
+	 { (char *)"RectangularDetector_regionOfInterestPixel", _wrap_RectangularDetector_regionOfInterestPixel, METH_VARARGS, (char *)"RectangularDetector_regionOfInterestPixel(RectangularDetector self) -> RectangularPixel"},
 	 { (char *)"RectangularDetector_swigregister", RectangularDetector_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_RectangularPixel", _wrap_new_RectangularPixel, METH_VARARGS, (char *)"\n"
 		"new_RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height) -> RectangularPixel\n"