diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py
new file mode 100644
index 0000000000000000000000000000000000000000..739c892996107743241714555ea1f9290808885c
--- /dev/null
+++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py
@@ -0,0 +1,30 @@
+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.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
+from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
+
+
+class AbstractQuantileEstimator(AbstractEstimator):
+
+    def __init__(self, quantile: float, **kwargs):
+        super().__init__(**kwargs)
+        assert 0 < quantile < 1
+        self.quantile = quantile
+
+    @cached_property
+    def quantile_function_from_fit(self) -> AbstractQuantileFunction:
+        pass
+
+
+class QuantileEstimatorFromMargin(AbstractQuantileEstimator, LinearMarginEstimator):
+
+    def __init__(self, dataset: AbstractDataset, margin_model: LinearMarginModel, quantile):
+        super().__init__(dataset=dataset, quantile=quantile, margin_model=margin_model)
+
+    @cached_property
+    def quantile_function_from_fit(self) -> AbstractQuantileFunction:
+        linear_margin_function = super().margin_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/estimator/quantile_estimator/abstract_quantile_function.py
new file mode 100644
index 0000000000000000000000000000000000000000..d39b121fa60ce859972207ce766b33c25ee2678e
--- /dev/null
+++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py
@@ -0,0 +1,14 @@
+import numpy as np
+
+from extreme_fit.model.margin_model.margin_function.abstract_margin_function import AbstractMarginFunction
+
+
+class AbstractQuantileFunction(object):
+
+    def __init__(self, margin_function: AbstractMarginFunction, quantile: float):
+        self.margin_function = margin_function
+        self.quantile = quantile
+
+    def get_quantile(self, coordinate: np.ndarray) -> float:
+        gev_params = self.margin_function.get_gev_params(coordinate)
+        return gev_params.quantile(self.quantile)
\ No newline at end of file
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 36cf25bc5b8c840b5157a6f480cb73c4832020e3..7f5eabb26e0bd89f3a2868dd1186d4bbe815e5f7 100644
--- a/test/test_extreme_fit/test_estimator/test_margin_estimators.py
+++ b/test/test_extreme_fit/test_estimator/test_margin_estimators.py
@@ -40,6 +40,3 @@ class TestSmoothMarginEstimator(unittest.TestCase):
 
 if __name__ == '__main__':
     unittest.main()
-    # t = TestSmoothMarginEstimator()
-    # t.test_smooth_margin_estimator_spatio_temporal()
-    # t.tearDown()
diff --git a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py
new file mode 100644
index 0000000000000000000000000000000000000000..9bf1a3c12b01f9d472c904a0a10b755855d19b73
--- /dev/null
+++ b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py
@@ -0,0 +1,41 @@
+import unittest
+
+from extreme_fit.estimator.quantile_estimator.abstract_quantile_estimator import QuantileEstimatorFromMargin
+from spatio_temporal_dataset.dataset.simulation_dataset import MarginDataset
+from test.test_utils import load_test_1D_and_2D_spatial_coordinates, load_test_spatiotemporal_coordinates, \
+    load_smooth_margin_models
+
+
+class TestSmoothMarginEstimator(unittest.TestCase):
+    DISPLAY = False
+
+    def test_smooth_margin_estimator_spatial(self):
+        self.nb_points = 2
+        self.nb_obs = 2
+        self.coordinates = load_test_1D_and_2D_spatial_coordinates(nb_points=self.nb_points)
+
+    def test_smooth_margin_estimator_spatio_temporal(self):
+        self.nb_points = 2
+        self.nb_steps = 2
+        self.nb_obs = 1
+        self.coordinates = load_test_spatiotemporal_coordinates(nb_steps=self.nb_steps, nb_points=self.nb_points)
+
+    def tearDown(self) -> None:
+        quantile = 0.98
+        for coordinates in self.coordinates:
+            constant_margin_model = load_smooth_margin_models(coordinates=coordinates)[0]
+            dataset = MarginDataset.from_sampling(nb_obs=self.nb_obs,
+                                                  margin_model=constant_margin_model,
+                                                  coordinates=coordinates)
+            quantile_estimators = [QuantileEstimatorFromMargin(dataset, constant_margin_model, quantile)]
+            help(QuantileEstimatorFromMargin)
+
+            for quantile_estimator in quantile_estimators:
+                quantile_estimator.fit()
+                print(quantile_estimator.margin_function_from_fit)
+
+        # self.assertTrue(True)
+
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file