diff --git a/auto/Examples/fit/scatter2d/custom_objective_function.py b/auto/Examples/fit/scatter2d/custom_objective_function.py
index c37ff65eab0e98ce84c1012ac5f6e54a3bab7dfa..00d61fc9e3547e448e9c237556e7a8ba9df9feec 100755
--- a/auto/Examples/fit/scatter2d/custom_objective_function.py
+++ b/auto/Examples/fit/scatter2d/custom_objective_function.py
@@ -35,7 +35,7 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     objective = MyObjective()
-    objective.addSimulationAndData(model.get_simulation, data, 1)
+    objective.addFitPair(model.get_simulation, data, 1)
     objective.initPrint(10)
 
     P = ba.Parameters()
diff --git a/auto/Examples/fit/scatter2d/find_background.py b/auto/Examples/fit/scatter2d/find_background.py
index a6d19c9b75e1a3ca4634470c28f0f1059a2a85d5..72565a617972f409f5a47aa5d92294e6018949cc 100755
--- a/auto/Examples/fit/scatter2d/find_background.py
+++ b/auto/Examples/fit/scatter2d/find_background.py
@@ -42,7 +42,6 @@ def fake_data():
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
     return result
 
 
diff --git a/auto/Examples/fit/scatter2d/fit_along_slices.py b/auto/Examples/fit/scatter2d/fit_along_slices.py
index 5f52ff7062b0b952d995b4364900de8d31783e5e..086302dcc8dc61ccc8824c0bde0e8916da4c3511 100755
--- a/auto/Examples/fit/scatter2d/fit_along_slices.py
+++ b/auto/Examples/fit/scatter2d/fit_along_slices.py
@@ -35,12 +35,11 @@ def fake_data():
     # initial values which we will have to find later during the fit
     P = {'radius': 5*nm, 'height': 10*nm}
 
-    # retrieving simulated data in the form of numpy array
     simulation = model.get_simulation(P)
     simulation.setBackground(ba.PoissonBackground())
     result = simulation.simulate()
 
-    return result
+    return result.noisy(0.1, 0.1)
 
 
 class PlotObserver:
diff --git a/auto/Examples/fit/scatter2d/fit_with_masks.py b/auto/Examples/fit/scatter2d/fit_with_masks.py
index 33e27317530ad730e1fa154753152d5cd3e6eb4f..95acd099683df91c9522b7f599ffa81379c0ef46 100755
--- a/auto/Examples/fit/scatter2d/fit_with_masks.py
+++ b/auto/Examples/fit/scatter2d/fit_with_masks.py
@@ -56,10 +56,10 @@ def add_mask_to_simulation(simulation):
 
 
 if __name__ == '__main__':
-    data = model.fake_data()
+    data = model.fake_data().noisy(0.1, 0.1)
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(get_masked_simulation, data, 1)
+    fit_objective.addFitPair(get_masked_simulation, data, 1)
     fit_objective.initPrint(10)
     observer = ba_fitmonitor.PlotterGISAS()
     fit_objective.initPlot(10, observer)
diff --git a/auto/Examples/fit/scatter2d/lmfit_basics.py b/auto/Examples/fit/scatter2d/lmfit_basics.py
index 845e086ef12ac6a01db810859066f9577e6f712e..ff4a7afe4978a3bfbb572452626fe2b78fa970ca 100755
--- a/auto/Examples/fit/scatter2d/lmfit_basics.py
+++ b/auto/Examples/fit/scatter2d/lmfit_basics.py
@@ -12,7 +12,7 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(model.get_simulation, data, 1)
+    fit_objective.addFitPair(model.get_simulation, data, 1)
     fit_objective.initPrint(10)
 
     P = lmfit.Parameters()
diff --git a/auto/Examples/fit/scatter2d/lmfit_with_plotting.py b/auto/Examples/fit/scatter2d/lmfit_with_plotting.py
index 6054cfc413b9b6c62723ed80d6eaf757efae3573..4b2785ee77f4c8d231a8725b5f79fd5e4c9eba46 100755
--- a/auto/Examples/fit/scatter2d/lmfit_with_plotting.py
+++ b/auto/Examples/fit/scatter2d/lmfit_with_plotting.py
@@ -28,13 +28,13 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(model.get_simulation, data, 1)
+    fit_objective.addFitPair(model.get_simulation, data, 1)
     fit_objective.initPrint(10)
 
     P = lmfit.Parameters()
     P.add('radius', value=7*nm, min=5*nm, max=8*nm)
     P.add('length', value=10*nm, min=8*nm, max=14*nm)
-    
+
     plotter = LMFITPlotter(fit_objective)
     result = lmfit.minimize(fit_objective.evaluate_residuals,
                             P, iter_cb=plotter)
diff --git a/auto/Examples/fit/scatter2d/model1_cylinders.py b/auto/Examples/fit/scatter2d/model1_cylinders.py
index 3f6b70be7dac82a13ee7cc72824f5ea5083c5c41..bcc2435f299c0e98ea231b61c495afb0bfa200e9 100755
--- a/auto/Examples/fit/scatter2d/model1_cylinders.py
+++ b/auto/Examples/fit/scatter2d/model1_cylinders.py
@@ -48,13 +48,7 @@ def fake_data():
     """
     P = {'radius': 5*nm, 'height': 10*nm}
 
-    # retrieving simulated data in the form of numpy array
     simulation = get_simulation(P)
     result = simulation.simulate()
-    data = result.npArray()
 
-    # spoiling simulated data with the noise to produce "real" data
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
diff --git a/auto/Examples/fit/scatter2d/model2_hexlattice.py b/auto/Examples/fit/scatter2d/model2_hexlattice.py
index 868eede0966262f58913296b19bd9a81281b1e80..5cf760658db0df82d90cd1e57c24b6bfba6980e8 100755
--- a/auto/Examples/fit/scatter2d/model2_hexlattice.py
+++ b/auto/Examples/fit/scatter2d/model2_hexlattice.py
@@ -56,12 +56,4 @@ def fake_data():
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
-    data = result.npArray()
-
-    # spoiling simulated data with noise to produce "real" data
-    np.random.seed(0)
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
diff --git a/auto/Examples/fit/scatter2d/multiple_datasets.py b/auto/Examples/fit/scatter2d/multiple_datasets.py
index 7fe0eb29292aa6f5a91dce1c1da9e7ab6a454108..9def2912788efeb28804f15137e2bba9e2ecccdd 100755
--- a/auto/Examples/fit/scatter2d/multiple_datasets.py
+++ b/auto/Examples/fit/scatter2d/multiple_datasets.py
@@ -73,14 +73,7 @@ def fake_data(incident_alpha):
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
-    data = result.npArray()
-
-    # spoiling simulated data with the noise to produce "real" data
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
 
 
 class PlotObserver():
@@ -193,8 +186,8 @@ def run_fitting():
     data2 = fake_data(0.4*deg)
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(simulation1, data1, 1)
-    fit_objective.addSimulationAndData(simulation2, data2, 1)
+    fit_objective.addFitPair(simulation1, data1, 1)
+    fit_objective.addFitPair(simulation2, data2, 1)
     fit_objective.initPrint(10)
 
     # creating custom observer which will draw fit progress
diff --git a/auto/MiniExamples/fit/scatter2d/custom_objective_function.py b/auto/MiniExamples/fit/scatter2d/custom_objective_function.py
index c37ff65eab0e98ce84c1012ac5f6e54a3bab7dfa..00d61fc9e3547e448e9c237556e7a8ba9df9feec 100755
--- a/auto/MiniExamples/fit/scatter2d/custom_objective_function.py
+++ b/auto/MiniExamples/fit/scatter2d/custom_objective_function.py
@@ -35,7 +35,7 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     objective = MyObjective()
-    objective.addSimulationAndData(model.get_simulation, data, 1)
+    objective.addFitPair(model.get_simulation, data, 1)
     objective.initPrint(10)
 
     P = ba.Parameters()
diff --git a/auto/MiniExamples/fit/scatter2d/find_background.py b/auto/MiniExamples/fit/scatter2d/find_background.py
index c70267287c33ee0b34c6f366e86274d5fa27ba95..adf22b4dee316aa098ba68960ba4c46e933f702a 100755
--- a/auto/MiniExamples/fit/scatter2d/find_background.py
+++ b/auto/MiniExamples/fit/scatter2d/find_background.py
@@ -42,7 +42,6 @@ def fake_data():
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
     return result
 
 
diff --git a/auto/MiniExamples/fit/scatter2d/fit_along_slices.py b/auto/MiniExamples/fit/scatter2d/fit_along_slices.py
index 659e1ab348560b46469f32ed8b6edb1acc1d9ebf..9383f16397d0ed7efda33f804e38dfd3de4778d0 100755
--- a/auto/MiniExamples/fit/scatter2d/fit_along_slices.py
+++ b/auto/MiniExamples/fit/scatter2d/fit_along_slices.py
@@ -35,12 +35,11 @@ def fake_data():
     # initial values which we will have to find later during the fit
     P = {'radius': 5*nm, 'height': 10*nm}
 
-    # retrieving simulated data in the form of numpy array
     simulation = model.get_simulation(P)
     simulation.setBackground(ba.PoissonBackground())
     result = simulation.simulate()
 
-    return result
+    return result.noisy(0.1, 0.1)
 
 
 class PlotObserver:
diff --git a/auto/MiniExamples/fit/scatter2d/fit_with_masks.py b/auto/MiniExamples/fit/scatter2d/fit_with_masks.py
index dbbffebcd73bfc0a08df7179042e4441438bde59..ca1130b852b4c877b4fafa3c355a0562a895cbd6 100755
--- a/auto/MiniExamples/fit/scatter2d/fit_with_masks.py
+++ b/auto/MiniExamples/fit/scatter2d/fit_with_masks.py
@@ -56,10 +56,10 @@ def add_mask_to_simulation(simulation):
 
 
 if __name__ == '__main__':
-    data = model.fake_data()
+    data = model.fake_data().noisy(0.1, 0.1)
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(get_masked_simulation, data, 1)
+    fit_objective.addFitPair(get_masked_simulation, data, 1)
     fit_objective.initPrint(10)
     observer = ba_fitmonitor.PlotterGISAS()
     plt.close() # (hide plot) fit_objective.initPlot(10, observer)
diff --git a/auto/MiniExamples/fit/scatter2d/lmfit_basics.py b/auto/MiniExamples/fit/scatter2d/lmfit_basics.py
index 845e086ef12ac6a01db810859066f9577e6f712e..ff4a7afe4978a3bfbb572452626fe2b78fa970ca 100755
--- a/auto/MiniExamples/fit/scatter2d/lmfit_basics.py
+++ b/auto/MiniExamples/fit/scatter2d/lmfit_basics.py
@@ -12,7 +12,7 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(model.get_simulation, data, 1)
+    fit_objective.addFitPair(model.get_simulation, data, 1)
     fit_objective.initPrint(10)
 
     P = lmfit.Parameters()
diff --git a/auto/MiniExamples/fit/scatter2d/lmfit_with_plotting.py b/auto/MiniExamples/fit/scatter2d/lmfit_with_plotting.py
index d0d4ef5d32ab0c20553261c8cdde88f993acc127..643fa35722e31a7fe6fd8dbe278b5b820c9aecfe 100755
--- a/auto/MiniExamples/fit/scatter2d/lmfit_with_plotting.py
+++ b/auto/MiniExamples/fit/scatter2d/lmfit_with_plotting.py
@@ -28,13 +28,13 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(model.get_simulation, data, 1)
+    fit_objective.addFitPair(model.get_simulation, data, 1)
     fit_objective.initPrint(10)
 
     P = lmfit.Parameters()
     P.add('radius', value=7*nm, min=5*nm, max=8*nm)
     P.add('length', value=10*nm, min=8*nm, max=14*nm)
-    
+
     
     result = lmfit.minimize(fit_objective.evaluate_residuals,
                             P)
diff --git a/auto/MiniExamples/fit/scatter2d/model1_cylinders.py b/auto/MiniExamples/fit/scatter2d/model1_cylinders.py
index 6c6da038f425d4c01db4fa07177ca70396da75c4..b2bbf592a80e5762a1d962fc029bd13e82b3e19b 100755
--- a/auto/MiniExamples/fit/scatter2d/model1_cylinders.py
+++ b/auto/MiniExamples/fit/scatter2d/model1_cylinders.py
@@ -48,13 +48,7 @@ def fake_data():
     """
     P = {'radius': 5*nm, 'height': 10*nm}
 
-    # retrieving simulated data in the form of numpy array
     simulation = get_simulation(P)
     result = simulation.simulate()
-    data = result.npArray()
 
-    # spoiling simulated data with the noise to produce "real" data
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
diff --git a/auto/MiniExamples/fit/scatter2d/model2_hexlattice.py b/auto/MiniExamples/fit/scatter2d/model2_hexlattice.py
index df2d9533eb52dc87cbd7b79e85093f2f1dc0597e..e65c5f0bd9782637c6d6afca225d38915545e4f5 100755
--- a/auto/MiniExamples/fit/scatter2d/model2_hexlattice.py
+++ b/auto/MiniExamples/fit/scatter2d/model2_hexlattice.py
@@ -56,12 +56,4 @@ def fake_data():
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
-    data = result.npArray()
-
-    # spoiling simulated data with noise to produce "real" data
-    np.random.seed(0)
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
diff --git a/auto/MiniExamples/fit/scatter2d/multiple_datasets.py b/auto/MiniExamples/fit/scatter2d/multiple_datasets.py
index 0c6adf23897f32b1e62ed7d7764209abe00269ba..aa1f4d20cc8d656edc88af848566790ed5e8bfed 100755
--- a/auto/MiniExamples/fit/scatter2d/multiple_datasets.py
+++ b/auto/MiniExamples/fit/scatter2d/multiple_datasets.py
@@ -73,14 +73,7 @@ def fake_data(incident_alpha):
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
-    data = result.npArray()
-
-    # spoiling simulated data with the noise to produce "real" data
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
 
 
 class PlotObserver():
@@ -193,8 +186,8 @@ def run_fitting():
     data2 = fake_data(0.4*deg)
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(simulation1, data1, 1)
-    fit_objective.addSimulationAndData(simulation2, data2, 1)
+    fit_objective.addFitPair(simulation1, data1, 1)
+    fit_objective.addFitPair(simulation2, data2, 1)
     fit_objective.initPrint(10)
 
     # creating custom observer which will draw fit progress
diff --git a/rawEx/fit/scatter2d/custom_objective_function.py b/rawEx/fit/scatter2d/custom_objective_function.py
index c37ff65eab0e98ce84c1012ac5f6e54a3bab7dfa..00d61fc9e3547e448e9c237556e7a8ba9df9feec 100755
--- a/rawEx/fit/scatter2d/custom_objective_function.py
+++ b/rawEx/fit/scatter2d/custom_objective_function.py
@@ -35,7 +35,7 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     objective = MyObjective()
-    objective.addSimulationAndData(model.get_simulation, data, 1)
+    objective.addFitPair(model.get_simulation, data, 1)
     objective.initPrint(10)
 
     P = ba.Parameters()
diff --git a/rawEx/fit/scatter2d/find_background.py b/rawEx/fit/scatter2d/find_background.py
index 788d5f6001571ee8d979b18c7733d8c870d141bf..8720eb52d8d6f95aa9efa421f2fdd582a82129fb 100755
--- a/rawEx/fit/scatter2d/find_background.py
+++ b/rawEx/fit/scatter2d/find_background.py
@@ -42,7 +42,6 @@ def fake_data():
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
     return result
 
 
diff --git a/rawEx/fit/scatter2d/fit_along_slices.py b/rawEx/fit/scatter2d/fit_along_slices.py
index 66806408aee61505dd0a866bd349fb5ddc5192b2..da6989c7adb1df19204ddd275500dfc98288d484 100755
--- a/rawEx/fit/scatter2d/fit_along_slices.py
+++ b/rawEx/fit/scatter2d/fit_along_slices.py
@@ -35,12 +35,11 @@ def fake_data():
     # initial values which we will have to find later during the fit
     P = {'radius': 5*nm, 'height': 10*nm}
 
-    # retrieving simulated data in the form of numpy array
     simulation = model.get_simulation(P)
     simulation.setBackground(ba.PoissonBackground())
     result = simulation.simulate()
 
-    return result
+    return result.noisy(0.1, 0.1)
 
 
 class PlotObserver:
diff --git a/rawEx/fit/scatter2d/fit_with_masks.py b/rawEx/fit/scatter2d/fit_with_masks.py
index 8dd587b269354a8f5e21ab234cfe1fee1c0f6c5e..aaf0159d64602932b5ee0a1812ba5dff86f3bb0a 100755
--- a/rawEx/fit/scatter2d/fit_with_masks.py
+++ b/rawEx/fit/scatter2d/fit_with_masks.py
@@ -56,10 +56,10 @@ def add_mask_to_simulation(simulation):
 
 
 if __name__ == '__main__':
-    data = model.fake_data()
+    data = model.fake_data().noisy(0.1, 0.1)
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(get_masked_simulation, data, 1)
+    fit_objective.addFitPair(get_masked_simulation, data, 1)
     fit_objective.initPrint(10)
     observer = ba_fitmonitor.PlotterGISAS()
     <%= sm ? "plt.close() # (hide plot) " :"" %>fit_objective.initPlot(10, observer)
diff --git a/rawEx/fit/scatter2d/lmfit_basics.py b/rawEx/fit/scatter2d/lmfit_basics.py
index 845e086ef12ac6a01db810859066f9577e6f712e..ff4a7afe4978a3bfbb572452626fe2b78fa970ca 100755
--- a/rawEx/fit/scatter2d/lmfit_basics.py
+++ b/rawEx/fit/scatter2d/lmfit_basics.py
@@ -12,7 +12,7 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(model.get_simulation, data, 1)
+    fit_objective.addFitPair(model.get_simulation, data, 1)
     fit_objective.initPrint(10)
 
     P = lmfit.Parameters()
diff --git a/rawEx/fit/scatter2d/lmfit_with_plotting.py b/rawEx/fit/scatter2d/lmfit_with_plotting.py
index 267e8135dd5394e55fadab892daf86642913baac..7e68bd8c35b0412ae8c948a426cc0d5e5b7cb0ab 100755
--- a/rawEx/fit/scatter2d/lmfit_with_plotting.py
+++ b/rawEx/fit/scatter2d/lmfit_with_plotting.py
@@ -28,13 +28,13 @@ if __name__ == '__main__':
     data = model.fake_data()
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(model.get_simulation, data, 1)
+    fit_objective.addFitPair(model.get_simulation, data, 1)
     fit_objective.initPrint(10)
 
     P = lmfit.Parameters()
     P.add('radius', value=7*nm, min=5*nm, max=8*nm)
     P.add('length', value=10*nm, min=8*nm, max=14*nm)
-    
+
     <%= sm ? "" :"plotter = LMFITPlotter(fit_objective)" %>
     result = lmfit.minimize(fit_objective.evaluate_residuals,
                             P<%= sm ? "" :", iter_cb=plotter" %>)
diff --git a/rawEx/fit/scatter2d/model1_cylinders.py b/rawEx/fit/scatter2d/model1_cylinders.py
index 32d2ebdaf928ebada63a9e39fd4dce877b05f304..56d6d4e11bdc95d2d4cc7e0acb9ccb9a16ff37a8 100644
--- a/rawEx/fit/scatter2d/model1_cylinders.py
+++ b/rawEx/fit/scatter2d/model1_cylinders.py
@@ -48,13 +48,7 @@ def fake_data():
     """
     P = {'radius': 5*nm, 'height': 10*nm}
 
-    # retrieving simulated data in the form of numpy array
     simulation = get_simulation(P)
     result = simulation.simulate()
-    data = result.npArray()
 
-    # spoiling simulated data with the noise to produce "real" data
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
diff --git a/rawEx/fit/scatter2d/model2_hexlattice.py b/rawEx/fit/scatter2d/model2_hexlattice.py
index 83ad1dd15681ba7325185085efdd858eb7941f88..e6f82616e2a187b9a576e44b1f599de6230af5d2 100644
--- a/rawEx/fit/scatter2d/model2_hexlattice.py
+++ b/rawEx/fit/scatter2d/model2_hexlattice.py
@@ -56,12 +56,4 @@ def fake_data():
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
-    data = result.npArray()
-
-    # spoiling simulated data with noise to produce "real" data
-    np.random.seed(0)
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
diff --git a/rawEx/fit/scatter2d/multiple_datasets.py b/rawEx/fit/scatter2d/multiple_datasets.py
index 82d6b48e0dd966c77b673062f7f75a72f8ac7292..5edec05979f6e0406da6049f0c9f81f5c4528860 100755
--- a/rawEx/fit/scatter2d/multiple_datasets.py
+++ b/rawEx/fit/scatter2d/multiple_datasets.py
@@ -73,14 +73,7 @@ def fake_data(incident_alpha):
     simulation = get_simulation(P)
     result = simulation.simulate()
 
-    # retrieving simulated data in the form of numpy array
-    data = result.npArray()
-
-    # spoiling simulated data with the noise to produce "real" data
-    noise_factor = 0.1
-    noisy = np.random.normal(data, noise_factor*np.sqrt(data))
-    noisy[noisy < 0.1] = 0.1
-    return noisy
+    return result.noisy(0.1, 0.1)
 
 
 class PlotObserver():
@@ -193,8 +186,8 @@ def run_fitting():
     data2 = fake_data(0.4*deg)
 
     fit_objective = ba.FitObjective()
-    fit_objective.addSimulationAndData(simulation1, data1, 1)
-    fit_objective.addSimulationAndData(simulation2, data2, 1)
+    fit_objective.addFitPair(simulation1, data1, 1)
+    fit_objective.addFitPair(simulation2, data2, 1)
     fit_objective.initPrint(10)
 
     # creating custom observer which will draw fit progress