diff --git a/src/Class_Mod/Ap.py b/src/Class_Mod/Ap.py
new file mode 100644
index 0000000000000000000000000000000000000000..2084d2563ba70720c0dad371d066b11f4ba2d5c9
--- /dev/null
+++ b/src/Class_Mod/Ap.py
@@ -0,0 +1,16 @@
+from Packages import *
+
+class AP:
+    def __init__(self, X):
+        ## input matrix
+        self.__x = np.array(X)
+
+        # Fit PCA model
+        self.M = AffinityPropagation(damping=0.5, max_iter=200, convergence_iter=15, copy=True, preference=None,
+                                 affinity='euclidean', verbose=False, random_state=None)
+        self.M.fit(self.__x)
+        self.yp = self.M.predict(self.__x)+1
+    @property
+    def fit_optimal_(self):
+        clu = [f'cluster#{i}' for i in self.yp]
+        return self.__x, clu, self.M.cluster_centers_
\ No newline at end of file
diff --git a/src/Class_Mod/__init__.py b/src/Class_Mod/__init__.py
index 7c978eaa95e1831c19a48bbf7d39737534a38d0b..540a09349398300160773edb419b0bf9f1dec2c9 100644
--- a/src/Class_Mod/__init__.py
+++ b/src/Class_Mod/__init__.py
@@ -13,4 +13,5 @@ from .DxReader import DxRead, read_dx
 from .HDBSCAN_Clustering import Hdbscan
 from .SK_PLSR_ import PlsR
 from .PLSR_Preprocess import PlsProcess
-from .NMF_ import Nmf
\ No newline at end of file
+from .NMF_ import Nmf
+from .Ap import AP
\ No newline at end of file
diff --git a/src/Modules.py b/src/Modules.py
index 436e30d579f3a6222bcbce80d753de3161ac7a5a..6ac6f120363b153e98c293139c7166f0f8f4b2dc 100644
--- a/src/Modules.py
+++ b/src/Modules.py
@@ -1,5 +1,5 @@
 from Packages import *
-from Class_Mod import PlsR, LinearPCA, Umap, find_col_index, PinardPlsr, Nmf
+from Class_Mod import PlsR, LinearPCA, Umap, find_col_index, PinardPlsr, Nmf, AP
 from Class_Mod import LWPLSR, list_files, metrics, TpeIpls, reg_plot, resid_plot, Sk_Kmeans, DxRead, Hdbscan, read_dx, PlsProcess
 from Class_Mod.DATA_HANDLING import *
 from Class_Mod.Miscellaneous import prediction, download_results, plot_spectra, local_css
diff --git a/src/Packages.py b/src/Packages.py
index fd98471d80df3eb82c6aa7ffd3dd18b8fda9d76d..131385146d58e4d179258e26bca85f150a462ab7 100644
--- a/src/Packages.py
+++ b/src/Packages.py
@@ -19,7 +19,7 @@ from umap.umap_ import UMAP
 from sklearn.decomposition import PCA, NMF
 
 # Clustering
-from sklearn.cluster import KMeans, HDBSCAN
+from sklearn.cluster import KMeans, HDBSCAN,AffinityPropagation
 from scipy.spatial.distance import euclidean, cdist
 from scipy.sparse.csgraph import minimum_spanning_tree
 from scipy.sparse import csgraph
@@ -36,7 +36,6 @@ from sklearn.pipeline import Pipeline, FeatureUnion
 from sklearn.compose import TransformedTargetRegressor
 from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_absolute_percentage_error, r2_score
 from sklearn.cross_decomposition import PLSRegression
-
 ## Images and plots
 from PIL import Image
 import plotly.express as px
diff --git a/src/pages/1-samples_selection.py b/src/pages/1-samples_selection.py
index 77a8863c53e3eafee9799ce2b05cfdf1e6c4454c..de03b98e62d2866f40650c73da0120eba4377694 100644
--- a/src/pages/1-samples_selection.py
+++ b/src/pages/1-samples_selection.py
@@ -157,6 +157,11 @@ if not t.empty:
         non_clustered = np.where(labels == -1)
         labels[non_clustered] = 1000
         labels = labels.tolist()
+    
+    elif clus_method == cluster_methods[3]:
+        cl_model = AP(X=tcr)
+        data, labels, clu_centers = cl_model.fit_optimal_
+
 
 ###### 3- Samples selection using the reduced data preentation ######
 selec_strategy = ['center','random']