diff --git a/Sim/Fitting/FitObjective.cpp b/Sim/Fitting/FitObjective.cpp
index 8de498271eec2448d86dadc8b99a3cf0c3c1460a..f65ac12fde5b3b53c620b9b413b6d379648f902d 100644
--- a/Sim/Fitting/FitObjective.cpp
+++ b/Sim/Fitting/FitObjective.cpp
@@ -216,14 +216,14 @@ SimulationResult FitObjective::uncertaintyData(size_t i_item) const
 
 //! Returns relative difference between simulation and experimental data
 //! in the form of SimulationResult.
-std::vector<double> FitObjective::relativeDifference(size_t i_item) const
+SimulationResult FitObjective::relativeDifference(size_t i_item) const
 {
     return dataPair(i_item).relativeDifference();
 }
 
 //! Returns absolute value of difference between simulation and experimental data
 //! in the form of SimulationResult.
-std::vector<double> FitObjective::absoluteDifference(size_t i_item) const
+SimulationResult FitObjective::absoluteDifference(size_t i_item) const
 {
     return dataPair(i_item).absoluteDifference();
 }
diff --git a/Sim/Fitting/FitObjective.h b/Sim/Fitting/FitObjective.h
index 0d8eac05d33565373ac42820582fdd85f0c5715d..b0027ee427403df72d88d08bc16db04bd0c3a8b6 100644
--- a/Sim/Fitting/FitObjective.h
+++ b/Sim/Fitting/FitObjective.h
@@ -76,8 +76,8 @@ public:
     SimulationResult simulationResult(size_t i_item = 0) const;
     SimulationResult experimentalData(size_t i_item = 0) const;
     SimulationResult uncertaintyData(size_t i_item = 0) const;
-    std::vector<double> relativeDifference(size_t i_item = 0) const;
-    std::vector<double> absoluteDifference(size_t i_item = 0) const;
+    SimulationResult relativeDifference(size_t i_item = 0) const;
+    SimulationResult absoluteDifference(size_t i_item = 0) const;
 
     std::vector<double> experimental_array() const;
     std::vector<double> simulation_array() const;
diff --git a/Sim/Fitting/SimDataPair.cpp b/Sim/Fitting/SimDataPair.cpp
index 304018b82bda60317f8d08b17ad36bc5e91ffcad..a7f941b6f01e4f9c87c9507c102591efd6897bcd 100644
--- a/Sim/Fitting/SimDataPair.cpp
+++ b/Sim/Fitting/SimDataPair.cpp
@@ -193,7 +193,7 @@ std::vector<double> SimDataPair::user_weights_array() const
 
 //! Returns relative difference between simulation and experimental data.
 
-std::vector<double> SimDataPair::relativeDifference() const
+SimulationResult SimDataPair::relativeDifference() const
 {
     size_t N = m_sim_data->size();
     if (!N)
@@ -201,14 +201,16 @@ std::vector<double> SimDataPair::relativeDifference() const
     if (!m_exp_data || m_exp_data->size() != N)
         throw std::runtime_error("Different data shapes => won't compute relative difference");
 
-    std::vector<double> result(N, 0.);
+    std::vector<double> data(N, 0.);
     for (size_t i = 0; i < N; ++i)
-        result[i] = Numeric::relativeDifference(result[i], (*m_exp_data)[i]);
+        data[i] = Numeric::relativeDifference((*m_sim_data)[i], (*m_exp_data)[i]);
 
-    return result;
+    const Frame* f = m_sim_data->frame().clone();
+    Datafield df(f, data);
+    return {df, f};
 }
 
-std::vector<double> SimDataPair::absoluteDifference() const
+SimulationResult SimDataPair::absoluteDifference() const
 {
     size_t N = m_sim_data->size();
     if (!N)
@@ -216,11 +218,13 @@ std::vector<double> SimDataPair::absoluteDifference() const
     if (!m_exp_data || m_exp_data->size() != N)
         throw std::runtime_error("Different data shapes => won't compute absolute difference");
 
-    std::vector<double> result(N, 0.);
+    std::vector<double> data(N, 0.);
     for (size_t i = 0; i < N; ++i)
-        result[i] = std::abs(result[i] - (*m_exp_data)[i]);
+        data[i] = std::abs((*m_sim_data)[i] - (*m_exp_data)[i]);
 
-    return result;
+    const Frame* f = m_sim_data->frame().clone();
+    Datafield df(f, data);
+    return {df, f};
 }
 
 void SimDataPair::validate() const
diff --git a/Sim/Fitting/SimDataPair.h b/Sim/Fitting/SimDataPair.h
index 166fa93bc7154088a9514652ad9acd3ee873aef6..26afefe108a8dc799737e8334ae4b590c0231510 100644
--- a/Sim/Fitting/SimDataPair.h
+++ b/Sim/Fitting/SimDataPair.h
@@ -56,11 +56,11 @@ public:
 
     //! Returns the relative difference between simulated
     //! and experimental data cut to the ROI area
-    std::vector<double> relativeDifference() const;
+    SimulationResult relativeDifference() const;
 
     //! Returns the absolute difference between simulated
     //! and experimental data cut to the ROI area
-    std::vector<double> absoluteDifference() const;
+    SimulationResult absoluteDifference() const;
 
     //! Returns the flattened simulated intensities cut to the ROI area
     std::vector<double> simulation_array() const;
diff --git a/auto/Wrap/libBornAgainSim.py b/auto/Wrap/libBornAgainSim.py
index 0ed39a6320fb8947cc0463446fa154abdde7ec7f..a0c979ac9d807c3a7a02389dc7962e3999df259d 100644
--- a/auto/Wrap/libBornAgainSim.py
+++ b/auto/Wrap/libBornAgainSim.py
@@ -2364,11 +2364,11 @@ class FitObjective(object):
         return _libBornAgainSim.FitObjective_uncertaintyData_cpp(self, i_item)
 
     def relativeDifference(self, i_item=0):
-        r"""relativeDifference(FitObjective self, size_t i_item=0) -> vdouble1d_t"""
+        r"""relativeDifference(FitObjective self, size_t i_item=0) -> SimulationResult"""
         return _libBornAgainSim.FitObjective_relativeDifference(self, i_item)
 
     def absoluteDifference(self, i_item=0):
-        r"""absoluteDifference(FitObjective self, size_t i_item=0) -> vdouble1d_t"""
+        r"""absoluteDifference(FitObjective self, size_t i_item=0) -> SimulationResult"""
         return _libBornAgainSim.FitObjective_absoluteDifference(self, i_item)
 
     def experimental_array(self):
diff --git a/auto/Wrap/libBornAgainSim_wrap.cpp b/auto/Wrap/libBornAgainSim_wrap.cpp
index 3bc782622b103b6733f0819bb2471920f16d233d..cea4dcd4ab94845eb2d590bc46377bd514324100 100644
--- a/auto/Wrap/libBornAgainSim_wrap.cpp
+++ b/auto/Wrap/libBornAgainSim_wrap.cpp
@@ -31168,7 +31168,7 @@ SWIGINTERN PyObject *_wrap_FitObjective_relativeDifference__SWIG_0(PyObject *sel
   int res1 = 0 ;
   size_t val2 ;
   int ecode2 = 0 ;
-  std::vector< double,std::allocator< double > > result;
+  SimulationResult result;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitObjective, 0 |  0 );
@@ -31182,7 +31182,7 @@ SWIGINTERN PyObject *_wrap_FitObjective_relativeDifference__SWIG_0(PyObject *sel
   } 
   arg2 = static_cast< size_t >(val2);
   result = ((FitObjective const *)arg1)->relativeDifference(arg2);
-  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  resultobj = SWIG_NewPointerObj((new SimulationResult(result)), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -31194,7 +31194,7 @@ SWIGINTERN PyObject *_wrap_FitObjective_relativeDifference__SWIG_1(PyObject *sel
   FitObjective *arg1 = (FitObjective *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::vector< double,std::allocator< double > > result;
+  SimulationResult result;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitObjective, 0 |  0 );
@@ -31203,7 +31203,7 @@ SWIGINTERN PyObject *_wrap_FitObjective_relativeDifference__SWIG_1(PyObject *sel
   }
   arg1 = reinterpret_cast< FitObjective * >(argp1);
   result = ((FitObjective const *)arg1)->relativeDifference();
-  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  resultobj = SWIG_NewPointerObj((new SimulationResult(result)), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -31260,7 +31260,7 @@ SWIGINTERN PyObject *_wrap_FitObjective_absoluteDifference__SWIG_0(PyObject *sel
   int res1 = 0 ;
   size_t val2 ;
   int ecode2 = 0 ;
-  std::vector< double,std::allocator< double > > result;
+  SimulationResult result;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitObjective, 0 |  0 );
@@ -31274,7 +31274,7 @@ SWIGINTERN PyObject *_wrap_FitObjective_absoluteDifference__SWIG_0(PyObject *sel
   } 
   arg2 = static_cast< size_t >(val2);
   result = ((FitObjective const *)arg1)->absoluteDifference(arg2);
-  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  resultobj = SWIG_NewPointerObj((new SimulationResult(result)), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -31286,7 +31286,7 @@ SWIGINTERN PyObject *_wrap_FitObjective_absoluteDifference__SWIG_1(PyObject *sel
   FitObjective *arg1 = (FitObjective *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::vector< double,std::allocator< double > > result;
+  SimulationResult result;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_FitObjective, 0 |  0 );
@@ -31295,7 +31295,7 @@ SWIGINTERN PyObject *_wrap_FitObjective_absoluteDifference__SWIG_1(PyObject *sel
   }
   arg1 = reinterpret_cast< FitObjective * >(argp1);
   result = ((FitObjective const *)arg1)->absoluteDifference();
-  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  resultobj = SWIG_NewPointerObj((new SimulationResult(result)), SWIGTYPE_p_SimulationResult, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -36262,8 +36262,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "FitObjective_simulationResult", _wrap_FitObjective_simulationResult, METH_VARARGS, "FitObjective_simulationResult(FitObjective self, size_t i_item=0) -> SimulationResult"},
 	 { "FitObjective_experimentalData", _wrap_FitObjective_experimentalData, METH_VARARGS, "FitObjective_experimentalData(FitObjective self, size_t i_item=0) -> SimulationResult"},
 	 { "FitObjective_uncertaintyData_cpp", _wrap_FitObjective_uncertaintyData_cpp, METH_VARARGS, "FitObjective_uncertaintyData_cpp(FitObjective self, size_t i_item=0) -> SimulationResult"},
-	 { "FitObjective_relativeDifference", _wrap_FitObjective_relativeDifference, METH_VARARGS, "FitObjective_relativeDifference(FitObjective self, size_t i_item=0) -> vdouble1d_t"},
-	 { "FitObjective_absoluteDifference", _wrap_FitObjective_absoluteDifference, METH_VARARGS, "FitObjective_absoluteDifference(FitObjective self, size_t i_item=0) -> vdouble1d_t"},
+	 { "FitObjective_relativeDifference", _wrap_FitObjective_relativeDifference, METH_VARARGS, "FitObjective_relativeDifference(FitObjective self, size_t i_item=0) -> SimulationResult"},
+	 { "FitObjective_absoluteDifference", _wrap_FitObjective_absoluteDifference, METH_VARARGS, "FitObjective_absoluteDifference(FitObjective self, size_t i_item=0) -> SimulationResult"},
 	 { "FitObjective_experimental_array", _wrap_FitObjective_experimental_array, METH_O, "FitObjective_experimental_array(FitObjective self) -> vdouble1d_t"},
 	 { "FitObjective_simulation_array", _wrap_FitObjective_simulation_array, METH_O, "FitObjective_simulation_array(FitObjective self) -> vdouble1d_t"},
 	 { "FitObjective_uncertainties_cpp", _wrap_FitObjective_uncertainties_cpp, METH_O, "FitObjective_uncertainties_cpp(FitObjective self) -> vdouble1d_t"},