diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
index 264c7566bb8c8914ec2ce94bcc1d5d108dabc6e7..9d34c7c19e19d0a762504b92ee1392986a9555a0 100644
--- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
+++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
@@ -768,7 +768,7 @@ class StudyVisualizer(VisualizationParameters):
         estimator.fit()
 
         # Set visualization attributes for margin_fct
-        margin_fct = estimator.margin_function_from_fit
+        margin_fct = estimator.function_from_fit
         margin_fct._visualization_x_limits = self.study.visualization_x_limits
         margin_fct._visualization_y_limits = self.study.visualization_y_limits
         margin_fct.mask_2D = self.study.mask_french_alps
diff --git a/experiment/regression_margin/regression_margin.py b/experiment/regression_margin/regression_margin.py
index 0dfcdccc93a8ce7c6ba50dee8067eb3cd73959e7..33b67924c6eba9e4bdd09609154fa872dea70ee6 100644
--- a/experiment/regression_margin/regression_margin.py
+++ b/experiment/regression_margin/regression_margin.py
@@ -57,7 +57,7 @@ for i in range(nb_estimator):
     margin_model_for_estimator = margin_model_for_estimator_class(coordinates)
     full_estimator = FullEstimatorInASingleStepWithSmoothMargin(dataset, margin_model_for_estimator, max_stable_model)
     full_estimator.fit()
-    full_estimator.margin_function_from_fit.visualize_function(axes=axes, show=False)
+    full_estimator.function_from_fit.visualize_function(axes=axes, show=False)
 plt.show()
 
 # Display all the margin on the same graph for comparison
diff --git a/experiment/simulation/abstract_simulation.py b/experiment/simulation/abstract_simulation.py
index 2a94a6bc637726f135ae3013973311fb4940f8fa..70f591203221c3c702e0ed4c005bb45072ba59dc 100644
--- a/experiment/simulation/abstract_simulation.py
+++ b/experiment/simulation/abstract_simulation.py
@@ -59,7 +59,7 @@ class AbstractSimulation(object):
             estimator = estimator_class.from_dataset(dataset)  # type: AbstractEstimator
             # Fit the estimator and get the margin_function
             estimator.fit()
-            margin_function_fitted_list.append(estimator.margin_function_from_fit)
+            margin_function_fitted_list.append(estimator.function_from_fit)
 
         # Individual error dict
         self.dump_fitted_margins_pickle(estimator_class, margin_function_fitted_list)
diff --git a/experiment/trend_analysis/non_stationary_trends.py b/experiment/trend_analysis/non_stationary_trends.py
index 2c63e9575c5368dbecb42aa2642831a4b1332cf1..cf1a8c8ef715556f71f81ab0820be70d4b6d2459 100644
--- a/experiment/trend_analysis/non_stationary_trends.py
+++ b/experiment/trend_analysis/non_stationary_trends.py
@@ -75,7 +75,7 @@ class AbstractNonStationaryTrendTest(object):
     def get_mu_coefs(self, starting_point):
         # for the non stationary model gives the mu1 parameters that was fitted
         estimator = self.get_estimator(starting_point)
-        margin_function = estimator.margin_function_from_fit  # type: LinearMarginFunction
+        margin_function = estimator.function_from_fit  # type: LinearMarginFunction
         assert isinstance(margin_function, LinearMarginFunction)
         mu_coefs = [margin_function.mu_intercept, margin_function.mu1_temporal_trend]
         if self.has_spatial_coordinates:
diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py
index 2782f461dd9360784f3b584065240924d789feb3..45470bae3c5c6f75de3e0080bbe487af83b1b781 100644
--- a/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py
+++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py
@@ -131,20 +131,20 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
         return np.sign(self.time_derivative_of_return_level)
 
     def get_non_stationary_linear_coef(self, gev_param_name: str):
-        return self.unconstrained_estimator.margin_function_from_fit.get_coef(gev_param_name,
-                                                                              AbstractCoordinates.COORDINATE_T)
+        return self.unconstrained_estimator.function_from_fit.get_coef(gev_param_name,
+                                                                       AbstractCoordinates.COORDINATE_T)
 
     @cached_property
     def unconstrained_estimator_gev_params(self) -> GevParams:
         # Constant parameters correspond to the gev params in 1958
-        return self.unconstrained_estimator.margin_function_from_fit.get_gev_params(coordinate=np.array([1958]),
-                                                                                    is_transformed=False)
+        return self.unconstrained_estimator.function_from_fit.get_gev_params(coordinate=np.array([1958]),
+                                                                             is_transformed=False)
 
     @cached_property
     def constrained_estimator_gev_params(self) -> GevParams:
         # Constant parameters correspond to any gev params
-        return self.constrained_estimator.margin_function_from_fit.get_gev_params(coordinate=np.array([1958]),
-                                                                                  is_transformed=False)
+        return self.constrained_estimator.function_from_fit.get_gev_params(coordinate=np.array([1958]),
+                                                                           is_transformed=False)
 
     def time_derivative_times_years(self, nb_years):
         # Compute the slope strength
@@ -163,7 +163,7 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
     def relative_change_in_return_level(self, initial_year, final_year):
         return_level_values = []
         for year in [initial_year, final_year]:
-            gev_params = self.unconstrained_estimator.margin_function_from_fit.get_gev_params(
+            gev_params = self.unconstrained_estimator.function_from_fit.get_gev_params(
                 coordinate=np.array([year]),
                 is_transformed=False)
             return_level_values.append(gev_params.quantile(self.quantile_level))
@@ -289,7 +289,7 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
         label = 'Y({})'.format(year) if year is not None else label
         if year is None:
             year = 2019
-        gev_params_year = self.unconstrained_estimator.margin_function_from_fit.get_gev_params(
+        gev_params_year = self.unconstrained_estimator.function_from_fit.get_gev_params(
                 coordinate=np.array([year]),
                 is_transformed=False)
         extended_maxima = [gev_params_year.gumbel_inverse_standardization(q) for q in extended_quantiles]
@@ -380,7 +380,7 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
     def compute_empirical_quantiles(self, estimator):
         empirical_quantiles = []
         for year, maximum in sorted(zip(self.years, self.maxima), key=lambda t: t[1]):
-            gev_param = estimator.margin_function_from_fit.get_gev_params(
+            gev_param = estimator.function_from_fit.get_gev_params(
                 coordinate=np.array([year]),
                 is_transformed=False)
             maximum_standardized = gev_param.gumbel_standardization(maximum)
@@ -426,8 +426,8 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
         plt.gca().set_ylim(bottom=0)
 
     def get_gev_params_with_big_shape_and_correct_shape(self):
-        gev_params = self.unconstrained_estimator.margin_function_from_fit.get_gev_params(coordinate=np.array([YEAR_OF_INTEREST_FOR_RETURN_LEVEL]),
-                                                                                          is_transformed=False)  # type: GevParams
+        gev_params = self.unconstrained_estimator.function_from_fit.get_gev_params(coordinate=np.array([YEAR_OF_INTEREST_FOR_RETURN_LEVEL]),
+                                                                                   is_transformed=False)  # type: GevParams
         gev_params_with_corrected_shape = GevParams(loc=gev_params.location,
                                                     scale=gev_params.scale,
                                                     shape=0.5)
diff --git a/extreme_fit/estimator/abstract_estimator.py b/extreme_fit/estimator/abstract_estimator.py
index d9be72741d395408e86bb221ae5eae1147caad0b..c8e93cad38e6a333e301105a652b9dfb7a053577 100644
--- a/extreme_fit/estimator/abstract_estimator.py
+++ b/extreme_fit/estimator/abstract_estimator.py
@@ -2,6 +2,7 @@ from typing import Union
 
 from cached_property import cached_property
 
+from extreme_fit.function.abstract_function import AbstractFunction
 from extreme_fit.model.result_from_model_fit.abstract_result_from_model_fit import AbstractResultFromModelFit
 from extreme_fit.function.margin_function.abstract_margin_function import \
     AbstractMarginFunction
@@ -35,7 +36,7 @@ class AbstractEstimator(object):
         return self._result_from_fit
 
     @cached_property
-    def margin_function_from_fit(self) -> AbstractMarginFunction:
+    def function_from_fit(self) -> AbstractFunction:
         raise NotImplementedError
 
     # Short cut properties
diff --git a/extreme_fit/estimator/full_estimator/abstract_full_estimator.py b/extreme_fit/estimator/full_estimator/abstract_full_estimator.py
index 2657a8814f0319e9b8b2853bb4f3758ba2a895bb..b6ff59ce572d0c4c3200296cd5f00dc5d0ed4061 100644
--- a/extreme_fit/estimator/full_estimator/abstract_full_estimator.py
+++ b/extreme_fit/estimator/full_estimator/abstract_full_estimator.py
@@ -34,7 +34,7 @@ class SmoothMarginalsThenUnitaryMsp(AbstractFullEstimator):
         maxima_frech = AbstractMarginModel.gev2frech(maxima_gev=maxima_gev_train,
                                                      coordinates_values=self.dataset.coordinates_values(
                                                          self.train_split),
-                                                     margin_function=self.margin_estimator.margin_function_from_fit)
+                                                     margin_function=self.margin_estimator.function_from_fit)
         # Update maxima frech field through the dataset object
         self.dataset.set_maxima_frech(maxima_frech, split=self.train_split)
         # Estimate the max stable parameters
@@ -86,7 +86,7 @@ class FullEstimatorInASingleStepWithSmoothMargin(AbstractFullEstimator):
         )
 
     @cached_property
-    def margin_function_from_fit(self) -> LinearMarginFunction:
+    def function_from_fit(self) -> LinearMarginFunction:
         return load_margin_function(self, self.linear_margin_model)
 
 
diff --git a/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py b/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py
index 0e6f65370ba6775d100e6bfd5afef4e3e7a3c8e4..117594e3e986bc61f4c1f6c75ad2a44215485d0b 100644
--- a/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py
+++ b/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py
@@ -47,5 +47,5 @@ class LinearMarginEstimator(AbstractMarginEstimator):
         return compute_nllh(self, self.maxima_gev_train, self.coordinate_temp, self.margin_model)
 
     @cached_property
-    def margin_function_from_fit(self) -> LinearMarginFunction:
+    def function_from_fit(self) -> LinearMarginFunction:
         return load_margin_function(self, self.margin_model)
diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py
index 739c892996107743241714555ea1f9290808885c..d43aae929945e9ec8b9f27b4a4c9cf657017b57c 100644
--- a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py
+++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py
@@ -2,7 +2,7 @@ from cached_property import cached_property
 
 from extreme_fit.estimator.abstract_estimator import AbstractEstimator
 from extreme_fit.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator
-from extreme_fit.estimator.quantile_estimator.abstract_quantile_function import AbstractQuantileFunction
+from extreme_fit.function.abstract_quantile_function import AbstractQuantileFunction
 from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 
@@ -26,5 +26,5 @@ class QuantileEstimatorFromMargin(AbstractQuantileEstimator, LinearMarginEstimat
 
     @cached_property
     def quantile_function_from_fit(self) -> AbstractQuantileFunction:
-        linear_margin_function = super().margin_function_from_fit
+        linear_margin_function = super().function_from_fit
         return AbstractQuantileFunction(linear_margin_function, self.quantile)
diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py b/extreme_fit/function/abstract_quantile_function.py
similarity index 71%
rename from extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py
rename to extreme_fit/function/abstract_quantile_function.py
index ef9af2faba618d7b4fd1fd188119a9d2e2891053..4c06c95ec5f30bbc8ab287cbc517a73674faaf84 100644
--- a/extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py
+++ b/extreme_fit/function/abstract_quantile_function.py
@@ -1,9 +1,10 @@
 import numpy as np
 
+from extreme_fit.function.abstract_function import AbstractFunction
 from extreme_fit.function.margin_function.abstract_margin_function import AbstractMarginFunction
 
 
-class AbstractQuantileFunction(object):
+class AbstractQuantileFunction(AbstractFunction):
 
     def __init__(self, margin_function: AbstractMarginFunction, quantile: float):
         self.margin_function = margin_function
diff --git a/extreme_fit/function/margin_function/abstract_margin_function.py b/extreme_fit/function/margin_function/abstract_margin_function.py
index fb10aa4786ed0abbde175bf83ac9b9fbbedfb066..994e7ebc9ba57afb8c3905a75b9d23c09bc50d68 100644
--- a/extreme_fit/function/margin_function/abstract_margin_function.py
+++ b/extreme_fit/function/margin_function/abstract_margin_function.py
@@ -7,12 +7,13 @@ import pandas as pd
 from experiment.meteo_france_data.scm_models_data.visualization.utils import create_adjusted_axes
 from extreme_fit.distribution.gev.gev_params import GevParams
 from experiment.meteo_france_data.plot.create_shifted_cmap import imshow_shifted
+from extreme_fit.function.abstract_function import AbstractFunction
 from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
 from spatio_temporal_dataset.slicer.split import Split
 from root_utils import cached_property
 
 
-class AbstractMarginFunction(object):
+class AbstractMarginFunction(AbstractFunction):
     """
     AbstractMarginFunction maps points from a space S (could be 1D, 2D,...) to R^3 (the 3 parameters of the GEV)
     """
diff --git a/extreme_fit/model/margin_model/abstract_margin_model.py b/extreme_fit/model/margin_model/abstract_margin_model.py
index 245931391eb587e8f81da93012b096116bc06e87..ef7ae1a717688ec1e70393c92688292def490745 100644
--- a/extreme_fit/model/margin_model/abstract_margin_model.py
+++ b/extreme_fit/model/margin_model/abstract_margin_model.py
@@ -32,6 +32,7 @@ class AbstractMarginModel(AbstractModel, ABC):
         raise NotImplementedError
 
     def default_load_margin_functions(self, margin_function_class):
+        # todo: check it i could remove these attributes
         self.margin_function_sample = margin_function_class(coordinates=self.coordinates,
                                                             default_params=GevParams.from_dict(self.params_sample))
         self.margin_function_start_fit = margin_function_class(coordinates=self.coordinates,
diff --git a/test/test_experiment/test_coordinate_sensitivity.py b/test/test_experiment/test_coordinate_sensitivity.py
index e709029abfec4075542c843475e1eb6a15a32b42..f0eb3a4b1856510e7ba81ac1068c39ae6eb6fafd 100644
--- a/test/test_experiment/test_coordinate_sensitivity.py
+++ b/test/test_experiment/test_coordinate_sensitivity.py
@@ -33,15 +33,15 @@ class TestCoordinateSensitivity(unittest.TestCase):
                 if self.DISPLAY:
                     print('Stationary')
                     stationary_est = trend_test.get_estimator(starting_point=None)
-                    print(stationary_est.margin_function_from_fit.coordinates.df_all_coordinates)
+                    print(stationary_est.function_from_fit.coordinates.df_all_coordinates)
                     print(stationary_est.result_from_model_fit.convergence)
-                    print(stationary_est.margin_function_from_fit.coef_dict)
+                    print(stationary_est.function_from_fit.coef_dict)
                     print('Non Stationary')
                     non_stationary_est = trend_test.get_estimator(starting_point=1960)
                     print(non_stationary_est.result_from_model_fit.convergence)
                     non_stationary_est = trend_test.get_estimator(starting_point=1990)
                     print(non_stationary_est.result_from_model_fit.convergence)
-                    print(non_stationary_est.margin_function_from_fit.coef_dict)
+                    print(non_stationary_est.function_from_fit.coef_dict)
                     print(get_display_name_from_object_type(transformation_class), 'mu1s: ', mu1s)
                     print('\n')
                 self.assertTrue(0.0 not in mu1s)
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py
index ec0b6977c4e4667d9ac714534080fcf54c956218..d3e3a9e4fd5e2088c8f4098ff27d6a1e3f175b4c 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py
@@ -43,7 +43,7 @@ class TestGevTemporalExtremesBayesian(unittest.TestCase):
                                                           fit_method=self.fit_method)
         ref = {'loc': 0.34272436381693616, 'scale': 1.3222588712831973, 'shape': 0.30491484962825105}
         for year in range(1, 3):
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(np.array([year])).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(np.array([year])).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
@@ -55,8 +55,8 @@ class TestGevTemporalExtremesBayesian(unittest.TestCase):
         mu1_values = estimator.result_from_model_fit.df_posterior_samples.iloc[:, 1]
         self.assertTrue((mu1_values != 0).any())
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_gev_temporal_margin_fit_non_stationary_location_and_scale(self):
@@ -67,8 +67,8 @@ class TestGevTemporalExtremesBayesian(unittest.TestCase):
         mu1_values = estimator.result_from_model_fit.df_posterior_samples.iloc[:, 1]
         self.assertTrue((mu1_values != 0).any())
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
 
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py
index 8aee8f21c4e6ba22e464b46b03dc19a4ddd34115..018aeebbe686f4f1b68e9cf9c5dff44834c7462e 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py
@@ -42,7 +42,7 @@ class TestGevTemporalExtremesGumbel(unittest.TestCase):
                                                    fit_method=TemporalMarginFitMethod.extremes_fevd_mle)
         ref = {'loc': -0.0862185692806497, 'scale': 1.0818465357627252, 'shape': 0}
         for year in range(1, 3):
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(np.array([year])).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(np.array([year])).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
index 94f989744077be01fb8c40f801e12f513b1a5c57..88677c6799db15c97bbfe35d1af60808e48b86f4 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
@@ -43,7 +43,7 @@ class TestGevTemporalExtremesMle(unittest.TestCase):
                                                    fit_method=self.fit_method)
         ref = {'loc': 0.02191974259369493, 'scale': 1.0347946062900268, 'shape': 0.829052520147379}
         for year in range(1, 3):
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(np.array([year])).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(np.array([year])).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
             self.assertAlmostEqual(estimator.result_from_model_fit.nllh, estimator.nllh)
@@ -54,8 +54,8 @@ class TestGevTemporalExtremesMle(unittest.TestCase):
                                                    starting_year=0,
                                                    fit_method=self.fit_method)
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
         self.assertAlmostEqual(estimator.result_from_model_fit.nllh, estimator.nllh)
 
@@ -66,8 +66,8 @@ class TestGevTemporalExtremesMle(unittest.TestCase):
                                                    starting_year=0,
                                                    fit_method=self.fit_method)
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
         self.assertAlmostEqual(estimator.result_from_model_fit.nllh, estimator.nllh)
 
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_is_mev.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_is_mev.py
index 2e52087c5324cd49b23f4ab264dbb1b20a324fec..333cfd195456866b67d640dd93ece668993c6393 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_is_mev.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_is_mev.py
@@ -45,7 +45,7 @@ class TestGevTemporal(unittest.TestCase):
                                                    fit_method=self.fit_method)
         ref = {'loc': 0.04309190816463247, 'scale': 2.0688696961628437, 'shape': 0.8291528207825063}
         for year in range(1, 3):
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(np.array([year])).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(np.array([year])).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
@@ -56,21 +56,21 @@ class TestGevTemporal(unittest.TestCase):
             estimator = LinearMarginEstimator(self.dataset, margin_model)
             estimator.fit()
             # Checks that parameters returned are indeed different
-            mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-            mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+            mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+            mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
             self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_gev_temporal_margin_fit_nonstationary_with_start_point(self):
         # Create estimator
         estimator = self.fit_non_stationary_estimator(starting_point=3)
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks starting point parameter are well passed
-        self.assertEqual(3, estimator.margin_function_from_fit.starting_point)
+        self.assertEqual(3, estimator.function_from_fit.starting_point)
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertEqual(mle_params_estimated_year1, mle_params_estimated_year3)
-        mle_params_estimated_year5 = estimator.margin_function_from_fit.get_gev_params(np.array([5])).to_dict()
+        mle_params_estimated_year5 = estimator.function_from_fit.get_gev_params(np.array([5])).to_dict()
         self.assertNotEqual(mle_params_estimated_year5, mle_params_estimated_year3)
 
     def fit_non_stationary_estimator(self, starting_point):
@@ -84,8 +84,8 @@ class TestGevTemporal(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=28)
-        mu1_estimator1 = estimator1.margin_function_from_fit.mu1_temporal_trend
-        mu1_estimator2 = estimator2.margin_function_from_fit.mu1_temporal_trend
+        mu1_estimator1 = estimator1.function_from_fit.mu1_temporal_trend
+        mu1_estimator2 = estimator2.function_from_fit.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)
 
 
diff --git a/test/test_extreme_fit/test_estimator/test_margin_estimators.py b/test/test_extreme_fit/test_estimator/test_margin_estimators.py
index 7f5eabb26e0bd89f3a2868dd1186d4bbe815e5f7..9a5a5c552fe13e38d25c7cb7017facd2787bacca 100644
--- a/test/test_extreme_fit/test_estimator/test_margin_estimators.py
+++ b/test/test_extreme_fit/test_estimator/test_margin_estimators.py
@@ -34,7 +34,7 @@ class TestSmoothMarginEstimator(unittest.TestCase):
                 # Plot
                 if self.DISPLAY:
                     margin_model.margin_function_sample.visualize_function(show=True)
-                    estimator.margin_function_from_fit.visualize_function(show=True)
+                    estimator.function_from_fit.visualize_function(show=True)
         self.assertTrue(True)
 
 
diff --git a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py
index 9bf1a3c12b01f9d472c904a0a10b755855d19b73..bd517938b1dec9cb8c69ad594b9407b084942552 100644
--- a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py
+++ b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py
@@ -32,7 +32,7 @@ class TestSmoothMarginEstimator(unittest.TestCase):
 
             for quantile_estimator in quantile_estimators:
                 quantile_estimator.fit()
-                print(quantile_estimator.margin_function_from_fit)
+                print(quantile_estimator.function_from_fit)
 
         # self.assertTrue(True)
 
diff --git a/test/test_extreme_fit/test_model/test_margin_temporal.py b/test/test_extreme_fit/test_model/test_margin_temporal.py
index fdf159f2c88c3027de0920c035c6e67be0166acd..31b87e87d18d56e4b143e59a1802eb183bd8eaab 100644
--- a/test/test_extreme_fit/test_model/test_margin_temporal.py
+++ b/test/test_extreme_fit/test_model/test_margin_temporal.py
@@ -33,7 +33,7 @@ class TestMarginTemporal(unittest.TestCase):
         ref = {'loc': 1.3456595684773085, 'scale': 1.090369430386199, 'shape': 0.6845422250749476}
         for year in range(1, 3):
             coordinate = np.array([0.0, 0.0, year])
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(coordinate).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(coordinate).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
@@ -42,32 +42,32 @@ class TestMarginTemporal(unittest.TestCase):
         margin_model = LinearNonStationaryLocationMarginModel(self.coordinates)
         estimator = LinearMarginEstimator(self.dataset, margin_model)
         estimator.fit()
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1).to_dict()
         coordinate3 = np.array([0.0, 0.0, 3])
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(coordinate3).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(coordinate3).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_margin_fit_nonstationary_with_start_point(self):
         # Create estimator
         estimator = self.fit_non_stationary_estimator(starting_point=2)
         # By default, estimator find the good margin
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
-        self.assertAlmostEqual(estimator.margin_function_from_fit.mu1_temporal_trend,
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertAlmostEqual(estimator.function_from_fit.mu1_temporal_trend,
                                self.smooth_margin_model.margin_function_sample.mu1_temporal_trend,
                                places=3)
         # Checks starting point parameter are well passed
-        self.assertEqual(2, estimator.margin_function_from_fit.starting_point)
+        self.assertEqual(2, estimator.function_from_fit.starting_point)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1).to_dict()
         coordinate2 = np.array([0.0, 0.0, 2])
-        mle_params_estimated_year2 = estimator.margin_function_from_fit.get_gev_params(coordinate2).to_dict()
+        mle_params_estimated_year2 = estimator.function_from_fit.get_gev_params(coordinate2).to_dict()
         self.assertEqual(mle_params_estimated_year1, mle_params_estimated_year2)
         coordinate5 = np.array([0.0, 0.0, 5])
-        mle_params_estimated_year5 = estimator.margin_function_from_fit.get_gev_params(coordinate5).to_dict()
+        mle_params_estimated_year5 = estimator.function_from_fit.get_gev_params(coordinate5).to_dict()
         self.assertNotEqual(mle_params_estimated_year5, mle_params_estimated_year2)
 
     def fit_non_stationary_estimator(self, starting_point):
@@ -80,8 +80,8 @@ class TestMarginTemporal(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=20)
-        mu1_estimator1 = estimator1.margin_function_from_fit.mu1_temporal_trend
-        mu1_estimator2 = estimator2.margin_function_from_fit.mu1_temporal_trend
+        mu1_estimator1 = estimator1.function_from_fit.mu1_temporal_trend
+        mu1_estimator2 = estimator2.function_from_fit.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)
 
 
diff --git a/test/test_extreme_fit/test_model/test_margin_temporal_transformed.py b/test/test_extreme_fit/test_model/test_margin_temporal_transformed.py
index f4a42a813f58b0fd3a4107463eafa79fd396e0fc..66392b462da6dc3c498fabf3006c85163e720576 100644
--- a/test/test_extreme_fit/test_model/test_margin_temporal_transformed.py
+++ b/test/test_extreme_fit/test_model/test_margin_temporal_transformed.py
@@ -41,8 +41,8 @@ class TestMarginTemporalTransformed(unittest.TestCase):
                'shape': 0.7289248773961512}
         for year in range(1, 3):
             coordinate = np.array([0.0, 0.0, year])
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(coordinate,
-                                                                                     is_transformed=False).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(coordinate,
+                                                                              is_transformed=False).to_dict()
             self.assertEqual(mle_params_estimated, ref)
 
     def test_margin_fit_nonstationary(self):
@@ -50,32 +50,32 @@ class TestMarginTemporalTransformed(unittest.TestCase):
         margin_model = LinearNonStationaryLocationMarginModel(self.coordinates)
         estimator = LinearMarginEstimator(self.dataset, margin_model)
         estimator.fit()
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1,
+                                                                                is_transformed=False).to_dict()
         coordinate3 = np.array([0.0, 0.0, 3])
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(coordinate3,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(coordinate3,
+                                                                                is_transformed=False).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_margin_fit_nonstationary_with_start_point(self):
         # Create estimator
         estimator = self.fit_non_stationary_estimator(starting_point=2)
         # By default, estimator find the good margin
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1,
+                                                                                is_transformed=False).to_dict()
         coordinate2 = np.array([0.0, 0.0, 2])
-        mle_params_estimated_year2 = estimator.margin_function_from_fit.get_gev_params(coordinate2,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year2 = estimator.function_from_fit.get_gev_params(coordinate2,
+                                                                                is_transformed=False).to_dict()
         self.assertEqual(mle_params_estimated_year1, mle_params_estimated_year2)
         coordinate5 = np.array([0.0, 0.0, 5])
-        mle_params_estimated_year5 = estimator.margin_function_from_fit.get_gev_params(coordinate5,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year5 = estimator.function_from_fit.get_gev_params(coordinate5,
+                                                                                is_transformed=False).to_dict()
         self.assertNotEqual(mle_params_estimated_year5, mle_params_estimated_year2)
 
     def fit_non_stationary_estimator(self, starting_point):
@@ -88,8 +88,8 @@ class TestMarginTemporalTransformed(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=20)
-        mu1_estimator1 = estimator1.margin_function_from_fit.mu1_temporal_trend
-        mu1_estimator2 = estimator2.margin_function_from_fit.mu1_temporal_trend
+        mu1_estimator1 = estimator1.function_from_fit.mu1_temporal_trend
+        mu1_estimator2 = estimator2.function_from_fit.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)
 
 
diff --git a/test/test_extreme_fit/test_model/test_max_stable_temporal.py b/test/test_extreme_fit/test_model/test_max_stable_temporal.py
index 8a6a6b3bc1a6bf792e52cae976d3da6c96933967..cd111c342fcf92aee847d4aaa2b34cabe7340ceb 100644
--- a/test/test_extreme_fit/test_model/test_max_stable_temporal.py
+++ b/test/test_extreme_fit/test_model/test_max_stable_temporal.py
@@ -37,7 +37,7 @@ class TestMaxStableTemporal(unittest.TestCase):
         ref = {'loc': 1.2091156634312243, 'scale': 1.1210085591373455, 'shape': 0.9831957705294134}
         for year in range(1, 3):
             coordinate = np.array([0.0, 0.0, year])
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(coordinate).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(coordinate).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
@@ -47,32 +47,32 @@ class TestMaxStableTemporal(unittest.TestCase):
         estimator = FullEstimatorInASingleStepWithSmoothMargin(self.dataset, margin_model,
                                                                self.max_stable_model)
         estimator.fit()
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1).to_dict()
         coordinate3 = np.array([0.0, 0.0, 3])
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(coordinate3).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(coordinate3).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_margin_fit_nonstationary_with_start_point(self):
         # Create estimator
         estimator = self.fit_non_stationary_estimator(starting_point=2)
         # By default, estimator find the good margin
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
-        self.assertAlmostEqual(estimator.margin_function_from_fit.mu1_temporal_trend,
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertAlmostEqual(estimator.function_from_fit.mu1_temporal_trend,
                                self.smooth_margin_model.margin_function_sample.mu1_temporal_trend,
                                places=2)
         # Checks starting point parameter are well passed
-        self.assertEqual(2, estimator.margin_function_from_fit.starting_point)
+        self.assertEqual(2, estimator.function_from_fit.starting_point)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1).to_dict()
         coordinate2 = np.array([0.0, 0.0, 2])
-        mle_params_estimated_year2 = estimator.margin_function_from_fit.get_gev_params(coordinate2).to_dict()
+        mle_params_estimated_year2 = estimator.function_from_fit.get_gev_params(coordinate2).to_dict()
         self.assertEqual(mle_params_estimated_year1, mle_params_estimated_year2)
         coordinate5 = np.array([0.0, 0.0, 5])
-        mle_params_estimated_year5 = estimator.margin_function_from_fit.get_gev_params(coordinate5).to_dict()
+        mle_params_estimated_year5 = estimator.function_from_fit.get_gev_params(coordinate5).to_dict()
         self.assertNotEqual(mle_params_estimated_year5, mle_params_estimated_year2)
 
     def fit_non_stationary_estimator(self, starting_point):
@@ -86,8 +86,8 @@ class TestMaxStableTemporal(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=20)
-        mu1_estimator1 = estimator1.margin_function_from_fit.mu1_temporal_trend
-        mu1_estimator2 = estimator2.margin_function_from_fit.mu1_temporal_trend
+        mu1_estimator1 = estimator1.function_from_fit.mu1_temporal_trend
+        mu1_estimator2 = estimator2.function_from_fit.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)