diff --git a/src/experiments/groovy/TemperatureClustering.groovy b/src/experiments/groovy/TemperatureClustering.groovy
index 5f804eadd44f5bfd88e524b2921c975e29afee8a..cecc709914b96648ff53ea7d34bd7982d7a27736 100644
--- a/src/experiments/groovy/TemperatureClustering.groovy
+++ b/src/experiments/groovy/TemperatureClustering.groovy
@@ -2,9 +2,9 @@ import fr.irit.smac.amas4dc.AMAS4DC
 import fr.irit.smac.amas4dc.amas.AMASOption
 import fr.irit.smac.amas4dc.amas.MASSettings
 import fr.irit.smac.amas4dc.cluster.Cluster
-import fr.irit.smac.amas4dc.cluster.DataPoint
-import fr.irit.smac.amas4dc.cluster.DataPointFuser
-import fr.irit.smac.amas4dc.cluster.DistanceMethod
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPointFuser
+import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod
 import fr.irit.smac.lxplot.LxPlot
 import groovy.transform.ToString
 
diff --git a/src/experiments/groovy/TwoDimensionsPointsClustering.groovy b/src/experiments/groovy/TwoDimensionsPointsClustering.groovy
index 16ee07a97cd61760075fe34a268b4367ec2f8686..79eb2e4fd4ed793876ead340478e49044820bd36 100644
--- a/src/experiments/groovy/TwoDimensionsPointsClustering.groovy
+++ b/src/experiments/groovy/TwoDimensionsPointsClustering.groovy
@@ -2,8 +2,8 @@ import fr.irit.smac.amas4dc.AMAS4DC
 import fr.irit.smac.amas4dc.amas.AMASOption
 import fr.irit.smac.amas4dc.amas.MASSettings
 import fr.irit.smac.amas4dc.cluster.Cluster
-import fr.irit.smac.amas4dc.cluster.DataPoint
-import fr.irit.smac.amas4dc.cluster.DistanceMethod
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint
+import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod
 import fr.irit.smac.lxplot.LxPlot
 import fr.irit.smac.lxplot.commons.ChartType
 import groovy.transform.ToString
diff --git a/src/main/java/fr/irit/smac/amas4dc/AMAS4DC.java b/src/main/java/fr/irit/smac/amas4dc/AMAS4DC.java
index 6433f9b8cd28d07ba71a595d98729de23195b224..6dd9cfb43b495cb40cb98de2255366ad6635c6a7 100644
--- a/src/main/java/fr/irit/smac/amas4dc/AMAS4DC.java
+++ b/src/main/java/fr/irit/smac/amas4dc/AMAS4DC.java
@@ -8,7 +8,7 @@ import fr.irit.smac.amas4dc.amas.controller.query.ExtendedResult;
 import fr.irit.smac.amas4dc.amas.controller.query.Result;
 import fr.irit.smac.amas4dc.amas.controller.query.RetrieveClustersExtendedResultQuery;
 import fr.irit.smac.amas4dc.amas.controller.query.RetrieveClustersResultQuery;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 
 import java.util.List;
 
@@ -18,13 +18,16 @@ public class AMAS4DC<T extends DataPoint> {
 	public AMAS4DC(MASSettings<T> masSettings) {
 		this.controller = new AMAS4DCCommandAndQueryHandler<T>(masSettings);
 	}
+
 	public void fit(List<T> data) {
 		controller.handle(new NewDataPointCommand<T>(data));
 		controller.handle(new SolveCommand());
 	}
+
 	public Result<T> retrieveClusters() {
 		return controller.handle(new RetrieveClustersResultQuery());
 	}
+
 	public ExtendedResult<T> retrieveExtendedClusters() {
 		return controller.handle(new RetrieveClustersExtendedResultQuery());
 	}
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/AMASOption.java b/src/main/java/fr/irit/smac/amas4dc/amas/AMASOption.java
index 943fd10e5fabc48e5b5e74fa7a85e4b50fbab300..b9fec55bbca58647d6c9eee90ada3e7dcd06e9f6 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/AMASOption.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/AMASOption.java
@@ -1,7 +1,5 @@
 package fr.irit.smac.amas4dc.amas;
 
 public enum AMASOption {
-	@Deprecated
-	Forget,
 	KeepAllDataPoints
 }
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringAMAS.java b/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringAMAS.java
index 680929a0bd308a0f4d2023ee7284b99288b1043c..6819af7c641049b4b25ef99654b1bdb565947f05 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringAMAS.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringAMAS.java
@@ -3,7 +3,7 @@ package fr.irit.smac.amas4dc.amas;
 import fr.irit.smac.amak.Amas;
 import fr.irit.smac.amas4dc.amas.agent.ClusterAgent;
 import fr.irit.smac.amas4dc.amas.agent.DataPointAgent;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import lombok.Getter;
 import lombok.Setter;
 
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringEnvironment.java b/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringEnvironment.java
index 83f61c6a46c74dfd5c6c85ffadc7ba654fb8c1de..24dcd28861af56294b50574e78f5667e703e3b5f 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringEnvironment.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/DynamicClusteringEnvironment.java
@@ -2,7 +2,7 @@ package fr.irit.smac.amas4dc.amas;
 
 import fr.irit.smac.amak.Environment;
 import fr.irit.smac.amas4dc.amas.agent.ClusterAgent;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import lombok.Getter;
 
 import java.util.*;
@@ -13,7 +13,6 @@ import java.util.logging.Logger;
 public class DynamicClusteringEnvironment<T extends DataPoint> extends Environment {
 
 	private final Queue<T> pendingAdditionDataPoints = new ConcurrentLinkedQueue<>();
-	private static final Logger logger = Logger.getLogger(DynamicClusteringEnvironment.class.getName());
 	@Getter
 	private T lastPolledPendingDataPoint = null;
 	private final Map<Integer, List<ClusterAgent<T>>> buckets = new ConcurrentHashMap<>();
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/MASSettings.java b/src/main/java/fr/irit/smac/amas4dc/amas/MASSettings.java
index 916cc216c141789fccdf514edf912f88f7b985c1..fcedf3410aa2f37fdb23bc545f626131c308531f 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/MASSettings.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/MASSettings.java
@@ -1,7 +1,9 @@
 package fr.irit.smac.amas4dc.amas;
 
-import fr.irit.smac.amak.event.EventStore;
-import fr.irit.smac.amas4dc.cluster.*;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPointDatabase;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPointFuser;
+import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod;
 
 import java.util.EnumSet;
 
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/agent/ClusterAgent.java b/src/main/java/fr/irit/smac/amas4dc/amas/agent/ClusterAgent.java
index 96fdc46a33d152b86bc6d5522cb62fc031750388..a1e45e0639e89545a8cb7cf6d3db23d4f516111a 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/agent/ClusterAgent.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/agent/ClusterAgent.java
@@ -2,7 +2,7 @@ package fr.irit.smac.amas4dc.amas.agent;
 
 import fr.irit.smac.amak.Agent;
 import fr.irit.smac.amas4dc.amas.AMASOption;
-import fr.irit.smac.amas4dc.amas.ClusterDistance;
+import fr.irit.smac.amas4dc.cluster.distance.ClusterDistance;
 import fr.irit.smac.amas4dc.amas.DynamicClusteringAMAS;
 import fr.irit.smac.amas4dc.amas.DynamicClusteringEnvironment;
 import fr.irit.smac.amas4dc.amas.messages.EvaluatedDistanceMessage;
@@ -10,7 +10,7 @@ import fr.irit.smac.amas4dc.amas.messages.InformMostSimilarMessage;
 import fr.irit.smac.amas4dc.amas.messages.RequestDataPointDistanceToBeAbsorbedMessage;
 import fr.irit.smac.amas4dc.amas.messages.RequestClusterDistanceToBeAbsorbedMessage;
 import fr.irit.smac.amas4dc.cluster.Cluster;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import fr.irit.smac.amas4dc.cluster.ExtendedCluster;
 import lombok.Getter;
 
@@ -20,22 +20,18 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAMAS<T>, DynamicClusteringEnvironment<T>> {
+	private static final Logger logger = Logger.getLogger(ClusterAgent.class.getName());
 	@Getter
-
 	private final Cluster<T> cluster;
 	private State state = State.DORMANT;
-	private State nextState = state;
 
 	private final Map<ClusterAgent<T>, ClusterDistance<T>> distancesReceived = new HashMap<>();
 
-	//region Action variables
-	//endregion
-	private static final Logger logger = Logger.getLogger(ClusterAgent.class.getName());
 
 	private Optional<RequestDataPointDistanceToBeAbsorbedMessage> receivedRequestDataPointDistanceToBeAbsorbedMessage = Optional.empty();
 	private Optional<RequestClusterDistanceToBeAbsorbedMessage> receivedRequestClusterDistanceToBeAbsorbedMessage = Optional.empty();
 	private Optional<InformMostSimilarMessage> receivedInformMostSimilarClusterAgentsMessage = Optional.empty();
-	private List<ClusterAgent<T>> requestDistanceMessageSentAgents = new ArrayList<>();
+	private final List<ClusterAgent<T>> requestDistanceMessageSentAgents = new ArrayList<>();
 
 	protected ClusterAgent(DynamicClusteringAMAS amas, T dataPoint) {
 		super(amas);
@@ -91,7 +87,6 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 				if (receivedRequestClusterDistanceToBeAbsorbedMessage.isPresent()) {
 					if (logger.isLoggable(Level.INFO))
 						logger.info(this + " received a request for distance to be absorbed");
-					return;
 				}
 			}
 			case WAITING_FOR_DISTANCE -> {
@@ -108,7 +103,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 
 
 	private void clearDeadAgentsFromThoseWeExpectAnAnswerFrom() {
-		requestDistanceMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !distancesReceived.keySet().contains(a));
+		requestDistanceMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !distancesReceived.containsKey(a));
 		for (var key :
 				distancesReceived.keySet()) {
 			if (!requestDistanceMessageSentAgents.contains(key))
@@ -118,6 +113,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 
 	@Override
 	protected void onDecideAndAct() {
+		State nextState = null;
 		switch (state) {
 			case DORMANT -> {
 				if (receivedRequestDataPointDistanceToBeAbsorbedMessage.isPresent()) {
@@ -154,13 +150,6 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 					} else {
 						nextState = State.DORMANT;
 					}
-				} else if (amas.getMasSettings().amasOptions().contains(AMASOption.Forget)) {
-					// TODO decide to die logic
-					/*
-					if (dieCondition()) {
-						destroy();
-					}
-					*/
 				}
 			}
 			case WAITING_FOR_DISTANCE -> {
@@ -197,19 +186,15 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 				}
 			}
 		}
-		applyNextState();
-	}
-
-
-	private void applyNextState() {
-		state = nextState;
+		if (nextState != null)
+			state = nextState;
 	}
 
 	private void absorbDataPoint(T otherDataPoint) {
 		if (logger.isLoggable(Level.INFO))
 			logger.info(this + " absorbs the data point " + otherDataPoint);
 
-		T newRepresentative = (T) amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherDataPoint);
+		amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherDataPoint);
 		cluster.addDataPoint(otherDataPoint);
 	}
 
@@ -218,8 +203,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 			logger.info(this + " absorbs the cluster " + otherCluster);
 
 		amas.getMasSettings().dataPointFuser().apply(cluster.getRepresentative(), otherCluster.getRepresentative());
-
-
+		
 		if (getAmas().getMasSettings().amasOptions().contains(AMASOption.KeepAllDataPoints))
 			((ExtendedCluster<T>) cluster).addClusterContent((ExtendedCluster<T>) otherCluster);
 		else
@@ -229,7 +213,7 @@ public class ClusterAgent<T extends DataPoint> extends Agent<DynamicClusteringAM
 
 	@Override
 	protected void onDestroy() {
-		nextState = State.DEAD;
+		state = State.DEAD;
 		amas.getMasSettings().database().remove(cluster.getRepresentative());
 		getAmas().getEnvironment().removeFromBucket(cluster.getRepresentative().getBucketId(), this);
 	}
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/agent/DataPointAgent.java b/src/main/java/fr/irit/smac/amas4dc/amas/agent/DataPointAgent.java
index 87792ba0da418fbbc9c1d9dd57974acef89a58fe..d52586812c17b67bcba8b478e676c46a47a1017e 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/agent/DataPointAgent.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/agent/DataPointAgent.java
@@ -1,14 +1,13 @@
 package fr.irit.smac.amas4dc.amas.agent;
 
 import fr.irit.smac.amak.Agent;
-import fr.irit.smac.amas4dc.amas.ClusterDistance;
+import fr.irit.smac.amas4dc.cluster.distance.ClusterDistance;
 import fr.irit.smac.amas4dc.amas.DynamicClusteringAMAS;
 import fr.irit.smac.amas4dc.amas.DynamicClusteringEnvironment;
 import fr.irit.smac.amas4dc.amas.messages.EvaluatedDistanceMessage;
 import fr.irit.smac.amas4dc.amas.messages.InformMostSimilarMessage;
 import fr.irit.smac.amas4dc.amas.messages.RequestDataPointDistanceToBeAbsorbedMessage;
-import fr.irit.smac.amas4dc.cluster.Cluster;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 
 import java.text.MessageFormat;
 import java.util.*;
@@ -16,11 +15,10 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClusteringAMAS<T>, DynamicClusteringEnvironment<T>> {
-	private static final float FLOAT_COMPARISON_EPSILON = 0.000001f;
+	private static final Logger logger = Logger.getLogger(DataPointAgent.class.getName());
 	private final T dataPoint;
 	private final List<ClusterAgent<T>> requestDistanceMessageSentAgents = new ArrayList<>();
 	private final Map<ClusterAgent<T>, ClusterDistance<T>> distancesReceived = new HashMap<>();
-	private static final Logger logger = Logger.getLogger(DataPointAgent.class.getName());
 
 	public DataPointAgent(DynamicClusteringAMAS<T> amas, T dataPoint) {
 		super(amas);
@@ -115,7 +113,7 @@ public class DataPointAgent<T extends DataPoint> extends Agent<DynamicClustering
 	}
 
 	private void clearDeadAgentsFromThoseWeExpectAnAnswerFrom() {
-		requestDistanceMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !distancesReceived.keySet().contains(a));
+		requestDistanceMessageSentAgents.removeIf(a -> a.getState() == ClusterAgent.State.DEAD && !distancesReceived.containsKey(a));
 		for (var key :
 				distancesReceived.keySet()) {
 			if (!requestDistanceMessageSentAgents.contains(key))
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/controller/AMAS4DCCommandAndQueryHandler.java b/src/main/java/fr/irit/smac/amas4dc/amas/controller/AMAS4DCCommandAndQueryHandler.java
index f984f25546a9bf10c3b78e8e4bb1e1161b95efb0..b33dfb961ee1afd54f88626559f98ed48b600da2 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/controller/AMAS4DCCommandAndQueryHandler.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/controller/AMAS4DCCommandAndQueryHandler.java
@@ -10,9 +10,9 @@ import fr.irit.smac.amas4dc.amas.controller.query.ExtendedResult;
 import fr.irit.smac.amas4dc.amas.controller.query.Result;
 import fr.irit.smac.amas4dc.amas.controller.query.RetrieveClustersExtendedResultQuery;
 import fr.irit.smac.amas4dc.amas.controller.query.RetrieveClustersResultQuery;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import fr.irit.smac.amas4dc.cluster.ExtendedCluster;
-import fr.irit.smac.amas4dc.cluster.SilhouetteScoreCalculator;
+import fr.irit.smac.amas4dc.cluster.evaluation.SilhouetteScoreCalculator;
 import lombok.Getter;
 
 import java.util.concurrent.Executors;
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/controller/command/NewDataPointCommand.java b/src/main/java/fr/irit/smac/amas4dc/amas/controller/command/NewDataPointCommand.java
index 70c99e2b3721342e7429d2ce8351a42048fc0658..105ff848afc78f87c4f353a1a8fbad32543022fb 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/controller/command/NewDataPointCommand.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/controller/command/NewDataPointCommand.java
@@ -1,6 +1,6 @@
 package fr.irit.smac.amas4dc.amas.controller.command;
 
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 
 import java.util.List;
 
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/ExtendedResult.java b/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/ExtendedResult.java
index 97ef4f17daefde3d2d5138da2d4838282ac1eba5..5b42601bc65333f7bb07caf38bd9d0d3f0ce75db 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/ExtendedResult.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/ExtendedResult.java
@@ -1,8 +1,7 @@
 package fr.irit.smac.amas4dc.amas.controller.query;
 
 import fr.irit.smac.amas4dc.amas.MASSettings;
-import fr.irit.smac.amas4dc.cluster.Cluster;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import fr.irit.smac.amas4dc.cluster.ExtendedCluster;
 
 import java.util.List;
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/Result.java b/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/Result.java
index 500d99ec68f3873b87fb5b9bc5098053c1e31e29..2ee3487ab6a976ce9c2fd0632874774de9f5afce 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/Result.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/controller/query/Result.java
@@ -2,7 +2,7 @@ package fr.irit.smac.amas4dc.amas.controller.query;
 
 import fr.irit.smac.amas4dc.amas.MASSettings;
 import fr.irit.smac.amas4dc.cluster.Cluster;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 
 import java.util.List;
 
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/EvaluatedDistanceMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/EvaluatedDistanceMessage.java
index 18a885c2ae6fa7b83a0a1a27f5aea67c51a0ec29..e813d5ab86a84add2ddc9a888e576ac01c521e0c 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/EvaluatedDistanceMessage.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/EvaluatedDistanceMessage.java
@@ -3,7 +3,7 @@ package fr.irit.smac.amas4dc.amas.messages;
 import fr.irit.smac.amak.messaging.Message;
 import fr.irit.smac.amas4dc.amas.agent.ClusterAgent;
 import fr.irit.smac.amas4dc.cluster.Cluster;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import lombok.Getter;
 import lombok.ToString;
 
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/InformMostSimilarMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/InformMostSimilarMessage.java
index 5cf0d9bf482e761f16ebe8471d7bab834b0f825d..c26863336ae143300d77b993f58ae39cba98fedf 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/InformMostSimilarMessage.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/InformMostSimilarMessage.java
@@ -3,9 +3,8 @@ package fr.irit.smac.amas4dc.amas.messages;
 import fr.irit.smac.amak.Agent;
 import fr.irit.smac.amak.messaging.Message;
 import fr.irit.smac.amas4dc.amas.agent.ClusterAgent;
-import fr.irit.smac.amas4dc.amas.agent.DataPointAgent;
 import fr.irit.smac.amas4dc.cluster.Cluster;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import lombok.Getter;
 
 import java.util.List;
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterDistanceToBeAbsorbedMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterDistanceToBeAbsorbedMessage.java
index af4c75a159953430b3afba748110c78822a4d5c3..dddbd42ebc1dcf05899d0f478396814976f420c7 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterDistanceToBeAbsorbedMessage.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestClusterDistanceToBeAbsorbedMessage.java
@@ -3,7 +3,7 @@ package fr.irit.smac.amas4dc.amas.messages;
 import fr.irit.smac.amak.messaging.Message;
 import fr.irit.smac.amas4dc.amas.agent.ClusterAgent;
 import fr.irit.smac.amas4dc.cluster.Cluster;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import lombok.Getter;
 
 public class RequestClusterDistanceToBeAbsorbedMessage<T extends DataPoint> extends Message<ClusterAgent<T>> {
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointDistanceToBeAbsorbedMessage.java b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointDistanceToBeAbsorbedMessage.java
index 8610e8823026b04ad1d3a712c3ebce1e9771dd50..273fefcbfe0d48c073c96df2bb3e26ba1fe7cba7 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointDistanceToBeAbsorbedMessage.java
+++ b/src/main/java/fr/irit/smac/amas4dc/amas/messages/RequestDataPointDistanceToBeAbsorbedMessage.java
@@ -2,7 +2,7 @@ package fr.irit.smac.amas4dc.amas.messages;
 
 import fr.irit.smac.amak.messaging.Message;
 import fr.irit.smac.amas4dc.amas.agent.DataPointAgent;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import lombok.Getter;
 
 public class RequestDataPointDistanceToBeAbsorbedMessage<T extends DataPoint> extends Message<DataPointAgent<T>> {
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/Cluster.java b/src/main/java/fr/irit/smac/amas4dc/cluster/Cluster.java
index cb7330d2f9a3e7f9102ffdc4be06c5b8f98f16ef..048d423b1c1a268185e230bf50c14e12554a2859 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/Cluster.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/Cluster.java
@@ -1,15 +1,10 @@
 package fr.irit.smac.amas4dc.cluster;
 
-import fr.irit.smac.amas4dc.amas.controller.MissingDataPointsException;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-
 @ToString
 public class Cluster<T extends DataPoint> {
 	@Getter
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedCluster.java b/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedCluster.java
index fc4a7d4b9c90ddf7eab3686e9c3d32e7bd1edbdf..5c5a116236e55c847fe12fa9ca47db036b2362ba 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedCluster.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedCluster.java
@@ -1,9 +1,9 @@
 package fr.irit.smac.amas4dc.cluster;
 
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 import lombok.Getter;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 public class ExtendedCluster<T extends DataPoint> extends Cluster<T> {
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPoint.java b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPoint.java
similarity index 61%
rename from src/main/java/fr/irit/smac/amas4dc/cluster/DataPoint.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPoint.java
index ac62dcb46e59f528551a865778050668281af5b4..5199f76ac98d5a21f56baead8cdbf2c940f2e9c8 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPoint.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPoint.java
@@ -1,4 +1,4 @@
-package fr.irit.smac.amas4dc.cluster;
+package fr.irit.smac.amas4dc.cluster.datapoint;
 
 public interface DataPoint {
 	default int getBucketId() {
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPointDatabase.java b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointDatabase.java
similarity index 88%
rename from src/main/java/fr/irit/smac/amas4dc/cluster/DataPointDatabase.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointDatabase.java
index 0f8cb532b1625892e592f8a7651415f1561496af..cb29e9b2c38119e8615927f274a096939808eb51 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPointDatabase.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointDatabase.java
@@ -1,4 +1,4 @@
-package fr.irit.smac.amas4dc.cluster;
+package fr.irit.smac.amas4dc.cluster.datapoint;
 
 import java.util.*;
 import java.util.logging.Level;
@@ -6,7 +6,7 @@ import java.util.logging.Logger;
 
 public class DataPointDatabase<T extends DataPoint> {
 	private static final Logger logger = Logger.getLogger(DataPointDatabase.class.getName());
-	private Set<T> content = new HashSet<>();
+	private final Set<T> content = new HashSet<>();
 	private T lastModifiedDataPoint;
 
 	public void add(T newDataPoint) {
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPointFuser.java b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointFuser.java
similarity index 72%
rename from src/main/java/fr/irit/smac/amas4dc/cluster/DataPointFuser.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointFuser.java
index 9d833f06bc8df0bc087a46e821ac03939c93214e..90788b8c67befe4e4b876079db8e430ece841400 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/DataPointFuser.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/datapoint/DataPointFuser.java
@@ -1,4 +1,4 @@
-package fr.irit.smac.amas4dc.cluster;
+package fr.irit.smac.amas4dc.cluster.datapoint;
 
 import java.util.function.BiFunction;
 
diff --git a/src/main/java/fr/irit/smac/amas4dc/amas/ClusterDistance.java b/src/main/java/fr/irit/smac/amas4dc/cluster/distance/ClusterDistance.java
similarity index 57%
rename from src/main/java/fr/irit/smac/amas4dc/amas/ClusterDistance.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/distance/ClusterDistance.java
index c454eb4bd9acd3d7a53aeab229d6b4b1d6319a51..8165099008392c0c15b7922359cf7c4b2265ef99 100644
--- a/src/main/java/fr/irit/smac/amas4dc/amas/ClusterDistance.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/distance/ClusterDistance.java
@@ -1,8 +1,8 @@
-package fr.irit.smac.amas4dc.amas;
+package fr.irit.smac.amas4dc.cluster.distance;
 
 
 import fr.irit.smac.amas4dc.cluster.Cluster;
-import fr.irit.smac.amas4dc.cluster.DataPoint;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 
 public record ClusterDistance<T extends DataPoint>(Cluster<T> cluster, float distance) {
 
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/DistanceMethod.java b/src/main/java/fr/irit/smac/amas4dc/cluster/distance/DistanceMethod.java
similarity index 55%
rename from src/main/java/fr/irit/smac/amas4dc/cluster/DistanceMethod.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/distance/DistanceMethod.java
index 7d1f1bf21e13edfe0251904c285d4a6d309c3dbf..14046eedbaaae6ce3cfc9cafa88ad7579ac1aa6a 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/DistanceMethod.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/distance/DistanceMethod.java
@@ -1,6 +1,8 @@
-package fr.irit.smac.amas4dc.cluster;
+package fr.irit.smac.amas4dc.cluster.distance;
 
 
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
+
 public interface DistanceMethod<T extends DataPoint> {
 	float apply(T dp1, T dp2);
 	boolean areRoughlySimilar(T dp1, T dp2);
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/CalinskiHarabazIndex.java b/src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/CalinskiHarabazIndex.java
similarity index 91%
rename from src/main/java/fr/irit/smac/amas4dc/cluster/CalinskiHarabazIndex.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/CalinskiHarabazIndex.java
index 72bcbf1c4b29bfc93c80dbb0262e051a1384163c..9c95f335fa6ec29ff41bf300b7abeeb9cb8a9518 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/CalinskiHarabazIndex.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/CalinskiHarabazIndex.java
@@ -1,6 +1,8 @@
-package fr.irit.smac.amas4dc.cluster;
+package fr.irit.smac.amas4dc.cluster.evaluation;
 
 import fr.irit.smac.amas4dc.amas.MASSettings;
+import fr.irit.smac.amas4dc.cluster.ExtendedCluster;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 
 import java.util.List;
 
@@ -11,7 +13,6 @@ public class CalinskiHarabazIndex<T extends DataPoint> {
 		var ssw = computeWithinClusterVariance(clusters, masSettings);
 
 		if (ssw == 0) {
-			// Avoid division by zero
 			return Double.POSITIVE_INFINITY;
 		}
 
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/SilhouetteScoreCalculator.java b/src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/SilhouetteScoreCalculator.java
similarity index 92%
rename from src/main/java/fr/irit/smac/amas4dc/cluster/SilhouetteScoreCalculator.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/SilhouetteScoreCalculator.java
index f389f58cf36c540fe13f8b5e2cc2e17cf62d064c..065f4d62c582e1977c0fc7b0e9a77018065a49f8 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/SilhouetteScoreCalculator.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/evaluation/SilhouetteScoreCalculator.java
@@ -1,8 +1,10 @@
-package fr.irit.smac.amas4dc.cluster;
+package fr.irit.smac.amas4dc.cluster.evaluation;
 
 import fr.irit.smac.amas4dc.amas.AMASOption;
 import fr.irit.smac.amas4dc.amas.MASSettings;
 import fr.irit.smac.amas4dc.amas.controller.MissingDataPointsException;
+import fr.irit.smac.amas4dc.cluster.ExtendedCluster;
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedClusterException.java b/src/main/java/fr/irit/smac/amas4dc/cluster/exception/ExtendedClusterException.java
similarity index 72%
rename from src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedClusterException.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/exception/ExtendedClusterException.java
index 2ae326c922ff185acf56cca7d32d05434455b946..e005e93ad1249f1ebd6e54697c9527d4f2b202fd 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/ExtendedClusterException.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/exception/ExtendedClusterException.java
@@ -1,4 +1,4 @@
-package fr.irit.smac.amas4dc.cluster;
+package fr.irit.smac.amas4dc.cluster.exception;
 
 public class ExtendedClusterException extends RuntimeException {
 	public ExtendedClusterException(String s) {
diff --git a/src/main/java/fr/irit/smac/amas4dc/cluster/FusionException.java b/src/main/java/fr/irit/smac/amas4dc/cluster/exception/FusionException.java
similarity index 71%
rename from src/main/java/fr/irit/smac/amas4dc/cluster/FusionException.java
rename to src/main/java/fr/irit/smac/amas4dc/cluster/exception/FusionException.java
index f81880eb92c4185f5552ddce2eac03ee0806b1d0..542709b103311582417f11f08828340f3e13d75a 100644
--- a/src/main/java/fr/irit/smac/amas4dc/cluster/FusionException.java
+++ b/src/main/java/fr/irit/smac/amas4dc/cluster/exception/FusionException.java
@@ -1,4 +1,4 @@
-package fr.irit.smac.amas4dc.cluster;
+package fr.irit.smac.amas4dc.cluster.exception;
 
 public class FusionException extends RuntimeException {
 	public FusionException(String message) {
diff --git a/src/test/groovy/SimpleClusteringIT.groovy b/src/test/groovy/SimpleClusteringIT.groovy
index ba75ddce1e63802216b68aa989e8cb85dc423d9f..fdbd112fef20fa48427e0e71235a12eaf328ff3c 100644
--- a/src/test/groovy/SimpleClusteringIT.groovy
+++ b/src/test/groovy/SimpleClusteringIT.groovy
@@ -1,9 +1,9 @@
 import fr.irit.smac.amas4dc.AMAS4DC
 import fr.irit.smac.amas4dc.amas.AMASOption
 import fr.irit.smac.amas4dc.amas.MASSettings
-import fr.irit.smac.amas4dc.cluster.DataPoint
-import fr.irit.smac.amas4dc.cluster.DataPointDatabase
-import fr.irit.smac.amas4dc.cluster.DistanceMethod
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPointDatabase
+import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod
 import spock.lang.Specification
 
 class SimpleClusteringIT extends Specification {
diff --git a/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy b/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy
index a485f349b0a60f835c96219a5afe01a69a39c487..842141c6611403470b5cfe2b2a1cde44c4e94205 100644
--- a/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy
+++ b/src/test/groovy/fr/irit/smac/amas4dc/amas/ClusterAgentTest.groovy
@@ -8,9 +8,9 @@ import fr.irit.smac.amas4dc.amas.messages.EvaluatedDistanceMessage
 import fr.irit.smac.amas4dc.amas.messages.RequestClusterDistanceToBeAbsorbedMessage
 import fr.irit.smac.amas4dc.amas.messages.RequestDataPointDistanceToBeAbsorbedMessage
 import fr.irit.smac.amas4dc.cluster.Cluster
-import fr.irit.smac.amas4dc.cluster.DataPoint
-import fr.irit.smac.amas4dc.cluster.DataPointFuser
-import fr.irit.smac.amas4dc.cluster.DistanceMethod
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPoint
+import fr.irit.smac.amas4dc.cluster.datapoint.DataPointFuser
+import fr.irit.smac.amas4dc.cluster.distance.DistanceMethod
 import spock.lang.Specification
 import spock.util.concurrent.BlockingVariable