diff --git a/Device/Data/Datafield.cpp b/Device/Data/Datafield.cpp
index 38a8185c0006622915e496e05cb3f9404c125861..b17581263960879a96d6642d71caabcde386492f 100644
--- a/Device/Data/Datafield.cpp
+++ b/Device/Data/Datafield.cpp
@@ -132,12 +132,7 @@ Datafield::Datafield(const std::string& xlabel, const std::string& ylabel,
                 newEquiDivision(ylabel, nrows, 0.0, (double)nrows)};
     m_frame.reset(new Frame(std::move(axes)));
 
-    m_values.reserve(nrows * ncols);
-    for (size_t j = 0; j < nrows; ++j) {
-        ASSERT(vec[j].size() == ncols);
-        for (size_t i = 0; i < ncols; ++i)
-            m_values.push_back(vec[j][i]);
-    }
+    setVector2D(vec);
 }
 
 Datafield::Datafield(Datafield&&) noexcept = default;
@@ -213,6 +208,21 @@ void Datafield::setVector(const std::vector<double>& vector)
     m_values = vector;
 }
 
+void Datafield::setVector2D(const std::vector<std::vector<double>>& in)
+{
+    const size_t ncols = axis(0).size();
+    const size_t nrows = axis(1).size();
+
+    ASSERT(in.size() == nrows);
+    m_values.clear();
+    m_values.reserve(nrows * ncols);
+    for (size_t j = 0; j < nrows; ++j) {
+        ASSERT(in[j].size() == ncols);
+        for (size_t i = 0; i < ncols; ++i)
+            m_values.push_back(in[j][i]);
+    }
+}
+
 size_t Datafield::rank() const
 {
     return frame().rank();
@@ -446,11 +456,6 @@ Datafield Datafield::normalizedToMax() const
 }
 
 std::vector<std::vector<double>> Datafield::values2D() const
-{
-    return to2Dvector(m_values);
-}
-
-std::vector<std::vector<double>> Datafield::to2Dvector(const std::vector<double>& in) const
 {
     ASSERT(rank() == 2);
     std::vector<std::vector<double>> result;
@@ -463,7 +468,7 @@ std::vector<std::vector<double>> Datafield::to2Dvector(const std::vector<double>
     for (size_t row = 0; row < nrows; ++row) {
         result[row].resize(ncols, 0.0);
         for (size_t col = 0; col < ncols; ++col)
-            result[row][col] = in[row * ncols + col];
+            result[row][col] = m_values[row * ncols + col];
     }
 
     return result;
diff --git a/Device/Data/Datafield.h b/Device/Data/Datafield.h
index 90c67110260e6e762a96901d679da78966381d4a..5428c6dc3453ccdef281bb9620021bf3a7ceb8ae 100644
--- a/Device/Data/Datafield.h
+++ b/Device/Data/Datafield.h
@@ -147,6 +147,7 @@ public:
 
     //! Sets new values to raw data vector.
     void setVector(const std::vector<double>& data_vector);
+    void setVector2D(const std::vector<std::vector<double>>& in);
 
     bool hasErrorSigmas() const;
     std::vector<double>& errorSigmas();
@@ -167,8 +168,6 @@ private:
     //! between [xbinlow, xbinup].
     Datafield* create_yProjection(int xbinlow, int xbinup) const;
 
-    std::vector<std::vector<double>> to2Dvector(const std::vector<double>& in) const;
-
 #endif // SWIG
 };
 
diff --git a/Device/Resolution/ConvolutionDetectorResolution.cpp b/Device/Resolution/ConvolutionDetectorResolution.cpp
index 571e3a5981fe17af1a01a65c4c2a18b29e5e5c55..a8b69dcda46731fdb9327d4e9c53a5560529a352 100644
--- a/Device/Resolution/ConvolutionDetectorResolution.cpp
+++ b/Device/Resolution/ConvolutionDetectorResolution.cpp
@@ -92,7 +92,7 @@ void ConvolutionDetectorResolution::apply1dConvolution(Datafield* df) const
     // Truncate negative values that can arise because of finite precision of Fourier Transform
     for (double& e : result)
         e = std::max(0.0, e);
-    // Populate intensity map with results
+
     df->setVector(result);
 }
 
@@ -124,17 +124,12 @@ void ConvolutionDetectorResolution::apply2dConvolution(Datafield* df) const
         }
         kernel[ix] = row_vector;
     }
+
     // Calculate convolution
     std::vector<std::vector<double>> result;
     Convolve().fftconvolve(df->values2D(), kernel, result);
 
-    // Populate intensity map with results
-    ASSERT(nx * ny == df->size());
-    for (size_t i = 0; i < df->size(); ++i) {
-        size_t i0 = df->frame().projectedIndex(i, 0);
-        size_t i1 = df->frame().projectedIndex(i, 1);
-        (*df)[i] = std::max(0.0, result[i0][i1]);
-    }
+    df->setVector2D(result);
 }
 
 double ConvolutionDetectorResolution::getIntegratedPDF1d(double x, double step) const