diff --git a/AMOEBAonAMAK/resources/threeDimensionsLauncher.xml b/AMOEBAonAMAK/resources/threeDimensionsLauncher.xml
index 1e1919cd9d4ddac06922fb27e110b363f61cda0c..aab252c4ba35642f2ad43f4eef92fe71fe13cd1b 100644
--- a/AMOEBAonAMAK/resources/threeDimensionsLauncher.xml
+++ b/AMOEBAonAMAK/resources/threeDimensionsLauncher.xml
@@ -6,21 +6,16 @@
 		<Learning allowed = "true" creationOfNewContext = "true" loadPresetContext = "false"></Learning>	
 	</Configuration>
 	
-	
 	<StartingAgents>
 	
-		<Sensor Name="px0" Enum="false" />
 		<Sensor Name="px1" Enum="false" />
 		<Sensor Name="px2" Enum="false" />
+		<Sensor Name="px3" Enum="false" />
 	
 	  	<Controller Name="Controller">
-              <ErrorMargin ErrorAllowed="2000.0" AugmentationFactorError="5.0" DiminutionFactorError="0.4" MinErrorAllowed="0.1" NConflictBeforeAugmentation="40" NSuccessBeforeDiminution="80" />
+              <ErrorMargin ErrorAllowed="1.0" AugmentationFactorError="0.5" DiminutionFactorError="0.5" MinErrorAllowed="0.01" NConflictBeforeAugmentation="50" NSuccessBeforeDiminution="50" />
               
         </Controller> 
-
-
-			
 	</StartingAgents>
 	
-	
 </System>
diff --git a/AMOEBAonAMAK/resources/threeDimensionsLauncherUnity.xml b/AMOEBAonAMAK/resources/threeDimensionsLauncherUnity.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ea0012a0810f27f03e731cb139e54089cb29018e
--- /dev/null
+++ b/AMOEBAonAMAK/resources/threeDimensionsLauncherUnity.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<System>
+
+	<!-- General config options -->
+	<Configuration>	
+		<Learning allowed = "true" creationOfNewContext = "true" loadPresetContext = "false"></Learning>	
+	</Configuration>
+	
+	<StartingAgents>
+	
+		<Sensor Name="px0" Enum="false" />
+		<Sensor Name="px1" Enum="false" />
+		<Sensor Name="px2" Enum="false" />
+	
+	  	<Controller Name="Controller">
+              <ErrorMargin ErrorAllowed="1.0" AugmentationFactorError="0.5" DiminutionFactorError="0.5" MinErrorAllowed="0.01" NConflictBeforeAugmentation="50" NSuccessBeforeDiminution="50" />
+              
+        </Controller> 
+	</StartingAgents>
+	
+</System>
diff --git a/AMOEBAonAMAK/src/agents/context/Context.java b/AMOEBAonAMAK/src/agents/context/Context.java
index 55fd51a44ae95f2d0927ef004f79cd4a1763bf08..0f601e60e99fdc66ae0a47bfc242531879d537a6 100644
--- a/AMOEBAonAMAK/src/agents/context/Context.java
+++ b/AMOEBAonAMAK/src/agents/context/Context.java
@@ -14,12 +14,14 @@ import agents.head.Criticalities;
 import agents.head.DynamicPerformance;
 import agents.head.EndogenousRequest;
 import agents.head.Head;
+import agents.head.REQUEST;
 import agents.percept.Percept;
 import gui.ContextRendererFX;
 import gui.RenderStrategy;
 import kernel.AMOEBA;
 import ncs.NCS;
 import utils.Pair;
+import utils.TRACE_LEVEL;
 
 /**
  * The core agent of AMOEBA.
@@ -62,25 +64,36 @@ public class Context extends AmoebaAgent {
 	
 	public DynamicPerformance regressionPerformance;
 	public Criticalities criticalities ;
+	public double lastDistanceToModel = -1.0;
+	public double lastAverageRegressionPerformanceIndicator = -1.0;
+	
+	public double  augmentationFactorError = 0.5;
+	public double  diminutionFactorError = 0.66;
+	public double  minError = 1;
+	public int temporalWindowCriticalityMean = 5;
+	public int successesBeforeDiminution = 5;
+	public int errorsBeforeAugmentation = 5;
 	
-
 	public Context(AMOEBA amoeba) {
 		super(amoeba);
 		buildContext();
-		criticalities = new Criticalities(3);
-		//regressionPerformance = new DynamicPerformance(10, 10, 200, 0.5, 0.5, 1);
-		regressionPerformance = new DynamicPerformance(3, 3, getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(), 0.5, 0.5, 1);
-		getAmas().getEnvironment().trace(new ArrayList<String>(Arrays.asList("CTXT CREATION", this.getName())));
+		criticalities = new Criticalities(5);
+		
+		regressionPerformance = new DynamicPerformance(successesBeforeDiminution, errorsBeforeAugmentation, getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(), augmentationFactorError, diminutionFactorError, minError);
+		getAmas().getEnvironment().trace(TRACE_LEVEL.EVENT,new ArrayList<String>(Arrays.asList("CTXT CREATION", this.getName())));
+		getAmas().addSpatiallyAlteredContextForUnityUI(this);
 	}
 
 	public Context(AMOEBA amoeba, Context bestNearestContext) {
 		super(amoeba);
 		buildContext(bestNearestContext);
 		getAmas().getEnvironment()
-				.trace(new ArrayList<String>(Arrays.asList("CTXT CREATION WITH GODFATHER", this.getName())));
-		criticalities = new Criticalities(3);
-		//regressionPerformance = new DynamicPerformance(10, 10, 200, 0.5, 0.5, 1);
-		regressionPerformance = new DynamicPerformance(3, 3, getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(), 0.5, 0.5, 1);
+				.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("CTXT CREATION WITH GODFATHER", this.getName())));
+		criticalities = new Criticalities(5);
+		
+		regressionPerformance = new DynamicPerformance(successesBeforeDiminution, errorsBeforeAugmentation, getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator(), augmentationFactorError, diminutionFactorError, minError);
+		getAmas().addSpatiallyAlteredContextForUnityUI(this);
+		
 		//TODO in amak, cannot kill a agent before its 1st cycle
 		//NCSDetection_Uselessness();
 
@@ -90,7 +103,7 @@ public class Context extends AmoebaAgent {
 		super(amoeba);
 		buildContext(fatherContext, contextDimensions);
 		getAmas().getEnvironment()
-				.trace(new ArrayList<String>(Arrays.asList("CTXT CREATION WITH GODFATHER AND DIM", this.getName())));
+				.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("CTXT CREATION WITH GODFATHER AND DIM", this.getName())));
 	}
 
 	private void buildContextCommon() {
@@ -200,7 +213,6 @@ public class Context extends AmoebaAgent {
 			((LocalModelMillerRegression) this.localModel).setCoef(coef);
 			this.actionProposition = ((LocalModelMillerRegression) fatherContext.localModel)
 					.getProposition(fatherContext);
-
 		}
 
 		getAmas().addAlteredContext(this);
@@ -263,7 +275,6 @@ public class Context extends AmoebaAgent {
 			((LocalModelMillerRegression) this.localModel).setCoef(coef);
 			this.actionProposition = ((LocalModelMillerRegression) bestNearestContext.localModel)
 					.getProposition(bestNearestContext);
-
 		}
 		
 		localModel.setFirstExperiments(new ArrayList<Experiment>(bestNearestContext.getLocalModel().getFirstExperiments()));
@@ -483,7 +494,7 @@ public class Context extends AmoebaAgent {
 	 * @param head the head
 	 */
 	public void solveNCS_IncompetentHead(Head head) {
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),
+		getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(),
 				"*********************************************************************************************************** SOLVE NCS INCOMPETENT HEAD")));
 
 		getEnvironment().raiseNCS(NCS.HEAD_INCOMPETENT);
@@ -497,7 +508,7 @@ public class Context extends AmoebaAgent {
 	 * @param head the head
 	 */
 	public void solveNCS_Concurrence(Head head) {
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),
+		getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(),
 				"*********************************************************************************************************** SOLVE NCS CONCURENCE")));
 
 		getEnvironment().raiseNCS(NCS.CONTEXT_CONCURRENCE);
@@ -513,7 +524,7 @@ public class Context extends AmoebaAgent {
 	 */
 	public void solveNCS_Uselessness() {
 		if (!isDying()) {
-			getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),
+			getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(),
 					"*********************************************************************************************************** SOLVE NCS USELESSNESS")));
 			getEnvironment().raiseNCS(NCS.CONTEXT_USELESSNESS);
 			this.destroy();
@@ -588,12 +599,18 @@ public class Context extends AmoebaAgent {
 
 	}
 
-	public void analyzeResults4(Head head, Context closestContextToOracle) {
-		
+	public void analyzeResults4(Head head) {
 		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+				+ "---------------------------------------- ANALYSE RESULTS " + this.getName())));
 		
-		if (head.getCriticity(this) < head.getErrorAllowed()) {
+		lastDistanceToModel = getLocalModel().distance(this.getCurrentExperiment());
+		lastAverageRegressionPerformanceIndicator = head.getAverageRegressionPerformanceIndicator();
+		if(lastDistanceToModel < lastAverageRegressionPerformanceIndicator) {
+		//if(getLocalModel().distance(this.getCurrentExperiment()) < head.getAverageRegressionPerformanceIndicator()) {
+		//if (head.getCriticity(this) < head.getErrorAllowed()) {
 			confidence++;
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(this.getName(), "CONFIDENCE ++")));
 		} else {
 			this.solveNCS_BadPrediction(head);
 		}
@@ -663,22 +680,22 @@ public class Context extends AmoebaAgent {
 	
 	
 	
-	public EndogenousRequest boundsToEndogenousRequest(HashMap<Percept, Pair<Double, Double>> bounds) {
-		HashMap<String, Double> request = new HashMap<String, Double>();
+	public HashMap<Percept, Double> boundsToRequest(HashMap<Percept, Pair<Double, Double>> bounds) {
+		HashMap<Percept, Double> request = new HashMap<Percept, Double>();
 		
 		for(Percept pct : bounds.keySet()) {
 			
 			if(bounds.get(pct) != null) {
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("ENDO REQUESTS BOUNDS", pct.getName(),""+ bounds.get(pct).getA(),""+ bounds.get(pct).getB(), ""+((bounds.get(pct).getB() + bounds.get(pct).getA())/2)) ));
-				request.put(pct.getName(), (bounds.get(pct).getB() + bounds.get(pct).getA())/2);
+				getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("ENDO REQUESTS BOUNDS", pct.getName(),""+ bounds.get(pct).getA(),""+ bounds.get(pct).getB(), ""+((bounds.get(pct).getB() + bounds.get(pct).getA())/2)) ));
+				request.put(pct, (bounds.get(pct).getB() + bounds.get(pct).getA())/2);
 			}else {
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("ENDO REQUESTS ERROR missing percept bounds")));
+				getEnvironment().trace(TRACE_LEVEL.ERROR, new ArrayList<String>(Arrays.asList("ENDO REQUESTS ERROR missing percept bounds")));
 			}
 			
 			
 		}
 		
-		return new EndogenousRequest(request, null);
+		return request;
 	}
 	
 	public EndogenousRequest endogenousRequest(Context ctxt) {
@@ -696,8 +713,8 @@ public class Context extends AmoebaAgent {
 		for (Percept pct : getAmas().getPercepts()) {
 			currentDistance = this.distance(ctxt, pct);
 			
-			if(currentDistance<-(pct.getMappingErrorAllowed()*0.1)) {
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("OVERLAP",pct.getName(), ""+this,""+ctxt)) );
+			if(currentDistance<-pct.getMappingErrorAllowedMin()) {
+				getEnvironment().trace(TRACE_LEVEL.DEBUG,new ArrayList<String>(Arrays.asList("OVERLAP",pct.getName(), ""+this,""+ctxt)) );
 				overlapCounts+=1;
 				overlapDistances.put(pct, Math.abs(currentDistance));
 				bounds.put(pct, this.overlapBounds(ctxt, pct));
@@ -706,8 +723,8 @@ public class Context extends AmoebaAgent {
 			}
 			
 
-			if (currentDistance > (pct.getMappingErrorAllowed()*0.1)) {
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("VOID",pct.getName(), ""+this,""+ctxt)) );
+			if (currentDistance > pct.getMappingErrorAllowedMin()) {
+				getEnvironment().trace(TRACE_LEVEL.DEBUG,new ArrayList<String>(Arrays.asList("VOID",pct.getName(), ""+this,""+ctxt, "distance", ""+currentDistance)) );
 				voidDistances.put(pct, currentDistance);
 				bounds.put(pct, this.voidBounds(ctxt, pct));
 			}
@@ -720,25 +737,25 @@ public class Context extends AmoebaAgent {
 
 		if (overlapCounts == getAmas().getPercepts().size()) {
 			
-			getEnvironment().trace(new ArrayList<String>(Arrays.asList(getAmas().getPercepts().size() + "OVERLAPS", ""+this,""+ctxt)) );
+			getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList(getAmas().getPercepts().size() + "OVERLAPS", ""+this,""+ctxt)) );
 			
-			EndogenousRequest request = boundsToEndogenousRequest(bounds);
-			if(request.getRequest() != null) {
-				return new EndogenousRequest(request.getRequest(), 5, new ArrayList<Context>(Arrays.asList(this,ctxt)));
+			HashMap<Percept, Double> request = boundsToRequest(bounds);
+			if(request != null) {
+				return new EndogenousRequest(request, bounds, 7, new ArrayList<Context>(Arrays.asList(this,ctxt)), REQUEST.OVERLAP);
 			}		
 		}
-//		else if(overlapCounts == getAmas().getPercepts().size()-1 && voidDistances.size() == 1) {
-//			
-//			getEnvironment().trace(new ArrayList<String>(Arrays.asList("VOID", ""+this,""+ctxt)) );
-//			
-//			EndogenousRequest request = boundsToEndogenousRequest(bounds);
-//			if(request.getRequest() != null) {
-//				
-//				if(getAmas().getHeadAgent().isVoid(request.getRequest())) {
-//					return new EndogenousRequest(request.getRequest(), 7, new ArrayList<Context>(Arrays.asList(this,ctxt)));
-//				}		
-//			}
-//		}
+		else if(overlapCounts == getAmas().getPercepts().size()-1 && voidDistances.size() == 1) {
+			
+			getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("VOID", ""+this,""+ctxt)) );
+			
+			HashMap<Percept, Double> request = boundsToRequest(bounds);
+			if(request != null) {
+				
+				if(getAmas().getHeadAgent().isVoid(request)) {
+					return new EndogenousRequest(request, bounds, 5, new ArrayList<Context>(Arrays.asList(this,ctxt)), REQUEST.VOID);
+				}		
+			}
+		}
 		else {
 			return null;
 		}
@@ -808,7 +825,7 @@ public class Context extends AmoebaAgent {
 	}
 
 	public void solveNCS_BetterNeighbor(Context betterContext) {
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), betterContext.getName(),
+		getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(), betterContext.getName(),
 				"*********************************************************************************************************** SOLVE NCS BETTER NEIGHBOR")));
 		localModel = new LocalModelMillerRegression(this, betterContext.getLocalModel().getCoef(),
 				betterContext.getLocalModel().getFirstExperiments());
@@ -816,8 +833,7 @@ public class Context extends AmoebaAgent {
 
 	public void NCSDetection_OverMapping() {
 		
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(), 
-				"*********************************************************************************************************** SOLVE NCS OVERMAPPING")));
+		
 		
 		
 		for(Context ctxt : getAmas().getHeadAgent().getActivatedNeighborsContexts()) {
@@ -831,19 +847,19 @@ public class Context extends AmoebaAgent {
 				double otherContextDistanceToOraclePrediction = ctxt.getLocalModel().distance(ctxt.getCurrentExperiment());
 				
 				//double minDistanceToOraclePrediction = Math.min(getAmas().getHeadAgent().getDistanceToRegressionAllowed(), getAmas().getHeadAgent().getDistanceToRegressionAllowed());
-				double averageDistanceToOraclePrediction = getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator();
+				Double averageDistanceToOraclePrediction = getAmas().getHeadAgent().getAverageRegressionPerformanceIndicator();
 						
 				if((currentDistanceToOraclePrediction<averageDistanceToOraclePrediction) && (otherContextDistanceToOraclePrediction<averageDistanceToOraclePrediction)) {
 					
-					getEnvironment().trace(new ArrayList<String>( Arrays.asList(this.getName(),"currentDistanceToOraclePrediction",""+ currentDistanceToOraclePrediction,"otherContextDistanceToOraclePrediction",""+ otherContextDistanceToOraclePrediction))); 
+					getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>( Arrays.asList(this.getName(),"currentDistanceToOraclePrediction",""+ currentDistanceToOraclePrediction,"otherContextDistanceToOraclePrediction",""+ otherContextDistanceToOraclePrediction))); 
 					
 					
 					for(Percept pct : ranges.keySet()) {
 						
 						boolean fusionTest = true;
 						
-						getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(),pct.getName(), ""+Math.abs(this.distance(ctxt, pct)), "DISTANCE", "" + getEnvironment().getMappingErrorAllowed())));
-						if(Math.abs(this.distance(ctxt, pct)) < pct.getMappingErrorAllowed()/2){		
+						getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(),pct.getName(), ""+Math.abs(this.distance(ctxt, pct)), "DISTANCE", "" + getEnvironment().getMappingErrorAllowed())));
+						if(Math.abs(this.distance(ctxt, pct)) < pct.getMappingErrorAllowedOverMapping()){		
 														
 							for(Percept otherPct : ranges.keySet()) {
 								
@@ -851,8 +867,8 @@ public class Context extends AmoebaAgent {
 																		
 									double lengthDifference = Math.abs(ranges.get(otherPct).getLenght() - ctxt.getRanges().get(otherPct).getLenght());
 									double centerDifference = Math.abs(ranges.get(otherPct).getCenter() - ctxt.getRanges().get(otherPct).getCenter());
-									getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(),otherPct.getName(), ""+lengthDifference,""+centerDifference, "LENGTH & CENTER DIFF", ""  + getEnvironment().getMappingErrorAllowed())));
-									fusionTest = fusionTest && (lengthDifference < otherPct.getMappingErrorAllowed()/2) && (centerDifference< otherPct.getMappingErrorAllowed()/2);
+									getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(this.getName(),ctxt.getName(),otherPct.getName(), ""+lengthDifference,""+centerDifference, "LENGTH & CENTER DIFF", ""  + getEnvironment().getMappingErrorAllowed())));
+									fusionTest = fusionTest && (lengthDifference < otherPct.getMappingErrorAllowedOverMapping()) && (centerDifference< otherPct.getMappingErrorAllowedOverMapping());
 								}
 							}
 							
@@ -871,7 +887,7 @@ public class Context extends AmoebaAgent {
 	}
 
 	private void solveNCS_OverMapping(Context fusionContext) {
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),
+		getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(),
 				"*********************************************************************************************************** SOLVE NCS OVERMAPPING")));
 		getEnvironment().raiseNCS(NCS.CONTEXT_OVERMAPPING);
 
@@ -882,17 +898,19 @@ public class Context extends AmoebaAgent {
 		}
 		
 		this.setConfidence(Math.max(this.getConfidence(), fusionContext.getConfidence()));
-
+		regressionPerformance.setPerformanceIndicator(Math.max(this.regressionPerformance.getPerformanceIndicator(), fusionContext.regressionPerformance.getPerformanceIndicator()));
+		
+		
 		fusionContext.destroy();
 		getAmas().getHeadAgent().setBadCurrentCriticalityMapping();
 	}
 	
 	public void solveNCS_ChildContext() {
-		HashMap<String, Double> request = new HashMap<String, Double>();
+		HashMap<Percept, Double> request = new HashMap<Percept, Double>();
 		for(Percept pct : getAmas().getPercepts()) {
-			request.put(pct.getName(), getRandomValueInRange(pct));
+			request.put(pct, getRandomValueInRange(pct));
 		}
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList("NEW ENDO REQUEST","10", ""+request, ""+this.getName())));
+		getEnvironment().trace(TRACE_LEVEL.EVENT,new ArrayList<String>(Arrays.asList("NEW ENDO REQUEST","10", ""+request, ""+this.getName())));
 		getAmas().getHeadAgent().addSelfRequest(request, 10,this);
 	}
 	
@@ -971,7 +989,7 @@ public class Context extends AmoebaAgent {
 	}
 
 	public void solveNCS_BadPrediction(Head head) {
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList(this.getName(),
+		getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(this.getName(),
 				"*********************************************************************************************************** SOLVE NCS CONFLICT")));
 		getEnvironment().raiseNCS(NCS.CONTEXT_CONFLICT_FALSE);
 
@@ -1186,7 +1204,7 @@ public class Context extends AmoebaAgent {
 						&& ranges.get(percept).getEnd() <= bestContextRanges.getEnd())) {
 
 					if (percept.contextOrder(this, bestContext)) {
-						getEnvironment().trace(new ArrayList<String>(
+						getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 								Arrays.asList("ORDER :", percept.getName(), this.getName(), bestContext.getName())));
 						vol = Math.abs(
 								percept.getEndRangeProjection(this) - percept.getStartRangeProjection(bestContext));
@@ -1195,7 +1213,7 @@ public class Context extends AmoebaAgent {
 							perceptWithBiggerImpact = percept;
 						}
 					} else if (percept.contextOrder(bestContext, this)) {
-						getEnvironment().trace(new ArrayList<String>(
+						getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 								Arrays.asList("ORDER :", percept.getName(), bestContext.getName(), this.getName())));
 						vol = Math.abs(
 								percept.getEndRangeProjection(bestContext) - percept.getStartRangeProjection(this));
@@ -1204,7 +1222,7 @@ public class Context extends AmoebaAgent {
 							perceptWithBiggerImpact = percept;
 						}
 					} else if (percept.contextIncludedIn(bestContext, this)) {
-						getEnvironment().trace(new ArrayList<String>(Arrays.asList("INCLUSION :", percept.getName(),
+						getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("INCLUSION :", percept.getName(),
 								bestContext.getName(), this.getName())));
 						vol = Math.abs(percept.getEndRangeProjection(bestContext)
 								- percept.getStartRangeProjection(bestContext));
@@ -1595,7 +1613,7 @@ public class Context extends AmoebaAgent {
 			boolean contain = ranges.get(pct).contains(pct.getValue()) == 0 ;
 	
 			if (!contain) {
-				if(ranges.get(pct).getLenght()<(pct.getMappingErrorAllowed()*1.5)) {
+				if(ranges.get(pct).getLenght()<pct.getMappingErrorAllowedMax()) {
 					ranges.get(pct).adapt(pct.getValue());
 				}
 				
@@ -1614,24 +1632,15 @@ public class Context extends AmoebaAgent {
 	public void shrinkRangesToJoinBorders(Context bestContext) {
 		Percept perceptWithBiggerImpactOnOverlap = getPerceptWithBiggerImpactOnOverlap(getAmas().getPercepts(),
 				bestContext);
-		// if(perceptWithLesserImpact!=null) world.trace(new
-		// ArrayList<String>(Arrays.asList(this.getName(),perceptWithLesserImpact.getName(),
-		// "PERCEPT BIGGER IMPACT")));
+
 
 		if (perceptWithBiggerImpactOnOverlap == null) {
 			this.destroy();
 		} else {
-			// ranges.get(perceptWithBiggerImpactOnOverlap).matchBorderWithBestContext(bestContext);
-			// ranges.get(perceptWithBiggerImpactOnOverlap).adaptTowardsBorder(bestContext);
+
 
 			ranges.get(perceptWithBiggerImpactOnOverlap).adapt(perceptWithBiggerImpactOnOverlap.getValue());
 
-//			if(testIfOtherContextShouldFinalyShrink(bestContext, perceptWithLesserImpact)){
-//				bestContext.getRanges().get(perceptWithLesserImpact).adaptTowardsBorder(this);
-//			}
-//			else {
-//				ranges.get(perceptWithLesserImpact).adaptTowardsBorder(bestContext);
-//			}
 		}
 	}
 
@@ -1937,13 +1946,21 @@ public class Context extends AmoebaAgent {
 		// s += "\n";
 		s += "\n";
 		
-		s += "Max Prediction " + getLocalModel().getMaxProposition(this) + "\n";
-		s += "Min Prediction " + getLocalModel().getMinProposition(this) + "\n";
-		
+		s += "Last Distance to Regression " + lastDistanceToModel + "\n";
+		s += "Last Average Distance To Regression Allowed "  + lastAverageRegressionPerformanceIndicator +"\n";
 		s += "Mean Distance To Regression " + criticalities.getCriticalityMean("distanceToRegression") + "\n";
 		s += "Distance To Regression Allowed " + regressionPerformance.getPerformanceIndicator() +"\n\n";
+		
+		s += "Max Prediction " + getLocalModel().getMaxProposition(this) + "\n";
+		s += "Min Prediction " + getLocalModel().getMinProposition(this) + "\n\n";
+		
+		s += "ASKED REQUEST " + waitingRequests.size() + "\n";
+		for(EndogenousRequest rqt : waitingRequests) {
+			s += rqt + "\n";
+		}
+		s += "\n";
 				
-				
+			
 		
 		for (Percept v : ranges.keySet()) {
 			s += v.getName() + " : " + ranges.get(v).toString() + "\n";
@@ -2046,15 +2063,15 @@ public class Context extends AmoebaAgent {
 
 	@Override
 	public void destroy() {
-		getEnvironment().trace(new ArrayList<String>(
+		getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(
 				Arrays.asList("-----------------------------------------", this.getName(), "DIE")));
+		
+		getAmas().addToKillContextForUnityUI(this);
 
 		for (Percept percept : getAmas().getPercepts()) {
 			percept.deleteContextProjection(this);
 		}
 		
-		
-
 		super.destroy();
 	}
 
@@ -2122,6 +2139,7 @@ public class Context extends AmoebaAgent {
 	
 	public void addWaitingRequest(EndogenousRequest request) {
 		waitingRequests.add(request);
+		getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("ADDED WAITING REQUEST", this.getName(), ""+waitingRequests.size(), ""+request)));
 	}
 	
 	public void deleteWaitingRequest(EndogenousRequest request) {
@@ -2132,4 +2150,79 @@ public class Context extends AmoebaAgent {
 		return regressionPerformance.getPerformanceIndicator();
 	}
 	
+	
+	
+	
+	/**
+	 * Compute the color of a {@link Context} based on the coefficients of its {@link LocalModel}
+	 * @param coefs
+	 * @return
+	 */
+	public String getColorForUnity() {
+		
+		Double[] coefs = localModel.getCoef();
+		
+		double upperBound = 255;
+		double dispersion = 100;
+		
+		
+		Double r = 0.0;
+		Double g = 0.0;
+		Double b = 0.0;
+
+		
+		
+		
+		if(coefs.length>=3) {
+			r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+			g =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[1]));
+			b =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[2]));
+			
+			if(r.isNaN() || g.isNaN() || b.isNaN()) {
+				r = 255.0;
+				g = 0.0;
+				b = 0.0;
+			}
+		}else if(coefs.length==2) {
+			r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+			g =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[1]));
+			
+			if(r.isNaN() || g.isNaN() || b.isNaN()) {
+				r = 255.0;
+				g = 0.0;
+			}
+		}else if(coefs.length==1) {
+			r =  normalizePositiveValues(upperBound, dispersion,  Math.abs(coefs[0]));
+			
+			if(r.isNaN() || g.isNaN() || b.isNaN()) {
+				r = 255.0;
+			}
+		}else {
+			r = 0.0;
+			g = 255.0;
+			b = 0.0;
+		}
+		
+		
+		Double[] ret = new Double[3];
+		ret[0] = r / 255.0d;
+		ret[1] = g / 255.0d;
+		ret[2] = b / 255.0d;
+		
+		return ret[0] + "," + ret[1] + "," + ret[2] + ",100";
+	}
+	
+	public static double normalizePositiveValues(double upperBound, double dispersion, double value) {
+		return upperBound * 2 * (-0.5 + 1 / (1 + Math.exp(-value / dispersion)));
+	}
+	
+	public boolean isFlat() {
+		for(Percept pct:getAmas().getPercepts()) {
+			if(ranges.get(pct).getLenght()<0.00001) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
 }
diff --git a/AMOEBAonAMAK/src/agents/context/Range.java b/AMOEBAonAMAK/src/agents/context/Range.java
index 704b4f5c2b9fabf03948ca5c2e97ffd8b36a3f1b..082754b311e52a8b0eab6b7606df584eb60278c6 100644
--- a/AMOEBAonAMAK/src/agents/context/Range.java
+++ b/AMOEBAonAMAK/src/agents/context/Range.java
@@ -9,6 +9,7 @@ import agents.percept.Percept;
 import kernel.World;
 import ncs.NCS;
 import utils.Pair;
+import utils.TRACE_LEVEL;
 
 // TODO: Auto-generated Javadoc
 /**
@@ -354,7 +355,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 	}
 
 	private void adaptEnd(double oracleValue, double increment) {
-		world.trace(new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT")));
+		world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("INCREMENT ON END ADAPT", context.getName(), percept.getName(), "" + increment )));
 
 		classicEndAdapt(oracleValue, increment);
 		// adaptEndWithSplitting(oracleValue, increment);
@@ -402,7 +403,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 	}
 
 	private void adaptEndWithSplitting(double oracleValue, double increment) {
-		world.trace(new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT")));
+		world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT")));
 
 		ArrayList<Context> bordererContexts = new ArrayList<Context>();
 
@@ -410,7 +411,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			for (Context ctxt : context.getAmas().getHeadAgent().getActivatedNeighborsContexts()) {
 
-				world.trace(new ArrayList<String>(
+				world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 						Arrays.asList(context.getName(), "" + this.distance(ctxt.getRanges().get(this.percept)),
 								"DISTANCE SPLIT", percept.getName(), ctxt.getName())));
 
@@ -432,7 +433,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 					}
 
 					if (bordererContextTest) {
-						world.trace(new ArrayList<String>(Arrays.asList(context.getName(), "END BORDER CONTEXT",
+						world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(context.getName(), "END BORDER CONTEXT",
 								percept.getName(), ctxt.getName())));
 						bordererContexts.add(ctxt);
 					}
@@ -441,7 +442,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			}
 			if (bordererContexts.size() > 0) {
-				world.trace(new ArrayList<String>(Arrays.asList("END BORDER CONTEXT", percept.getName())));
+				world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("END BORDER CONTEXT", percept.getName())));
 				double minAlternativeIncrement = increment;
 				double alternativeIncrement;
 				for (Context ctxt : bordererContexts) {
@@ -525,7 +526,8 @@ public class Range implements Serializable, Comparable, Cloneable {
 	}
 
 	private void adaptStart(double oracleValue, double increment) {
-		world.trace(new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT")));
+		world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("INCREMENT ON END ADAPT", context.getName(), percept.getName(), "" + increment )));
+
 
 		classicStartAdapt(oracleValue, increment);
 		// adaptStartWithSplitting(oracleValue, increment);
@@ -597,7 +599,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 	}
 
 	private void adaptStartWithSplitting(double oracleValue, double increment) {
-		world.trace(new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT")));
+		world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("" + increment, "INCREMENT")));
 		ArrayList<Context> bordererContexts = new ArrayList<Context>();
 
 		if (!(contains(oracleValue) == 0.0)) {
@@ -622,7 +624,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 					}
 
 					if (bordererContextTest) {
-						world.trace(new ArrayList<String>(
+						world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 								Arrays.asList("START BORDER CONTEXT", percept.getName(), ctxt.getName())));
 						bordererContexts.add(ctxt);
 					}
@@ -631,7 +633,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			}
 			if (bordererContexts.size() > 0) {
-				world.trace(new ArrayList<String>(Arrays.asList("START BORDER CONTEXT", percept.getName())));
+				world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("START BORDER CONTEXT", percept.getName())));
 				double minAlternativeIncrement = increment;
 				double alternativeIncrement;
 				for (Context ctxt : bordererContexts) {
@@ -794,12 +796,12 @@ public class Range implements Serializable, Comparable, Cloneable {
 	 * @return boolean representing if the range is too small.
 	 */
 	public boolean isTooSmall() {
-		if((end - start) < percept.getMappingErrorAllowed()*0.1 && (end - start)>0) {
-			////// System.out.println("£££££££££££££££££££££££££££££ mininimalRange :" +
-			////// mininimalRange + " ~~~ " + (end - start));
+		
+		if((end - start) < percept.getMappingErrorAllowedMin()) {
+			world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList(this.context.getName(), this.percept.getName(), "TOO SMALL DISTANCE", "" + (end - start))));
 		}
 
-		return ((end - start) < (percept.getMappingErrorAllowed() / 2)) && !this.isPerceptEnum();
+		return ((end - start) < percept.getMappingErrorAllowedMin()) && !this.isPerceptEnum();
 	}
 
 	/**
@@ -944,9 +946,9 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 	public void adaptOnOverlap(Range overlappingContextRanges, double border) {
 
-		world.trace(new ArrayList<String>(Arrays.asList(this.context.getName(), percept.getName(),
+		world.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList(this.context.getName(), percept.getName(),
 				"*********************************************************************************************************** ADAPT ON OVERLAP")));
-		world.trace(new ArrayList<String>(
+		world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 				Arrays.asList(this.context.getName(), overlappingContextRanges.getContext().getName())));
 		double increment = Math.min(Math.abs(this.distance(overlappingContextRanges)), getIncrement());
 
@@ -1003,10 +1005,10 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 				if (newContext) {
 
-					world.trace(new ArrayList<String>(
+					world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 							Arrays.asList(this.context.getName(), "" + context.getRanges().get(pct),
 									overlappingContext.getRanges().get(pct) + "", pct.getName(), "RANGES")));
-					world.trace(new ArrayList<String>(
+					world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 							Arrays.asList(this.context.getName(), "" + this.context.getRanges().get(pct).getLenght(),
 									this.context.getRanges().get(pct)
 											.overlapDistance(overlappingContext.getRanges().get(pct)) + "",
@@ -1033,7 +1035,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			world.raiseNCS(NCS.CREATE_NEW_CONTEXT);
 			for (Percept pct : context.getAmas().getPercepts()) {
-				world.trace(
+				world.trace(TRACE_LEVEL.DEBUG, 
 						new ArrayList<String>(Arrays.asList(pct.getName(), "" + newContextDimensions.get(pct).getA(),
 								"" + newContextDimensions.get(pct).getB(), "NEW DIM")));
 			}
@@ -1045,7 +1047,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 					System.out.println("TEST");
 					System.out.println(newContextDimensionsBis.get(pct).getA());
 					System.out.println(newContextDimensionsBis.get(pct).getB());
-					world.trace(new ArrayList<String>(
+					world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 							Arrays.asList(pct.getName(), "" + newContextDimensionsBis.get(pct).getA(),
 									"" + newContextDimensionsBis.get(pct).getB(), "NEW DIM")));
 				}
@@ -1058,9 +1060,9 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 	public void setOnConcurentOverlap(Range overlappingContextRanges, double border) {
 
-		world.trace(new ArrayList<String>(Arrays.asList(this.context.getName(), percept.getName(),
+		world.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList(this.context.getName(), percept.getName(),
 				"*********************************************************************************************************** SET ON OVERLAP")));
-		world.trace(new ArrayList<String>(
+		world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 				Arrays.asList(this.context.getName(), overlappingContextRanges.getContext().getName())));
 
 		double increment = Math.min(Math.abs(this.distance(overlappingContextRanges)), getIncrement());
@@ -1122,10 +1124,10 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 				if (newContext) {
 
-					world.trace(new ArrayList<String>(
+					world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 							Arrays.asList(this.context.getName(), "" + context.getRanges().get(pct),
 									overlappingContext.getRanges().get(pct) + "", pct.getName(), "RANGES")));
-					world.trace(new ArrayList<String>(
+					world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 							Arrays.asList(this.context.getName(), "" + this.context.getRanges().get(pct).getLenght(),
 									this.context.getRanges().get(pct)
 											.overlapDistance(overlappingContext.getRanges().get(pct)) + "",
@@ -1152,7 +1154,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			world.raiseNCS(NCS.CREATE_NEW_CONTEXT);
 			for (Percept pct : context.getAmas().getPercepts()) {
-				world.trace(
+				world.trace(TRACE_LEVEL.DEBUG, 
 						new ArrayList<String>(Arrays.asList(pct.getName(), "" + newContextDimensions.get(pct).getA(),
 								"" + newContextDimensions.get(pct).getB(), "NEW DIM")));
 			}
@@ -1166,7 +1168,7 @@ public class Range implements Serializable, Comparable, Cloneable {
 					System.out.println(newContextDimensionsBis.get(pct).getA());
 					System.out.println(newContextDimensionsBis.get(pct).getB());
 
-					world.trace(new ArrayList<String>(
+					world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 							Arrays.asList(pct.getName(), "" + newContextDimensionsBis.get(pct).getA(),
 									"" + newContextDimensionsBis.get(pct).getB(), "NEW DIM")));
 				}
@@ -1185,12 +1187,12 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 		ArrayList<Pair<Double, Double>> centersAndLengths = new ArrayList<Pair<Double, Double>>();
 
-		world.trace(new ArrayList<String>(
+		world.trace(TRACE_LEVEL.EVENT, new ArrayList<String>(
 				Arrays.asList(this.context.getName(), overlappingRange.getContext().getName(), "SEEK NON OVERLAPING")));
 
 		if (this.getStart() < overlappingRange.getStart() && overlappingRange.getEnd() < this.getEnd()) {
 
-			world.trace(new ArrayList<String>(Arrays.asList("CONTAINED", this.percept.getName())));
+			world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("CONTAINED", this.percept.getName())));
 			double center1 = (this.getStart() + overlappingRange.getStart()) / 2;
 			double center2 = (overlappingRange.getEnd() + this.getEnd()) / 2;
 			double length1 = overlappingRange.getStart() - this.getStart();
@@ -1199,13 +1201,13 @@ public class Range implements Serializable, Comparable, Cloneable {
 			centersAndLengths.add(new Pair<Double, Double>(center2, length2));
 		} else if (this.getStart() < overlappingRange.getStart() && overlappingRange.getStart() < this.getEnd()) {
 
-			world.trace(new ArrayList<String>(Arrays.asList("START", this.percept.getName())));
+			world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("START", this.percept.getName())));
 			double center = (this.getStart() + overlappingRange.getStart()) / 2;
 			double length = overlappingRange.getStart() - this.getStart();
 			centersAndLengths.add(new Pair<Double, Double>(center, length));
 		} else if (this.getStart() < overlappingRange.getEnd() && overlappingRange.getEnd() < this.getEnd()) {
 
-			world.trace(new ArrayList<String>(Arrays.asList("END", this.percept.getName())));
+			world.trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("END", this.percept.getName())));
 			double center = (overlappingRange.getEnd() + this.getEnd()) / 2;
 			double length = this.getEnd() - overlappingRange.getEnd();
 			centersAndLengths.add(new Pair<Double, Double>(center, length));
@@ -1458,8 +1460,14 @@ public class Range implements Serializable, Comparable, Cloneable {
 //		}
 		
 		this.start = newStartValue;
+		
+		
 
 		if (this.context != null) {
+			
+			world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
+					Arrays.asList(this.context.getName(), this.percept.getName(), "SET START", "" + newStartValue)));
+			
 			lastStartTickModification = this.context.getAmas().getCycle();
 			this.percept.updateContextProjectionStart(this.context);
 			context.getAmas().addLastmodifiedContext(context);
@@ -1490,11 +1498,10 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			this.context.updateActivatedContextsCopyForUpdate();
 
-			world.trace(new ArrayList<String>(
-					Arrays.asList(this.context.getName(), this.percept.getName(), "SET START", "" + newStartValue)));
+			
 
-			if (!this.context.isDying() && !context.getAmas().getSpatiallyAlteredContext().contains(this.context)) {
-				context.getAmas().addSpatiallyAlteredContext(this.context);
+			if (!this.context.isDying() && !context.getAmas().getSpatiallyAlteredContextForUnityUI().contains(this.context)) {
+				context.getAmas().addSpatiallyAlteredContextForUnityUI(this.context);
 			}
 		}
 
@@ -1519,8 +1526,12 @@ public class Range implements Serializable, Comparable, Cloneable {
 //		}
 		
 		this.end = newEndValue;
+		
 
 		if (this.context != null) {
+			world.trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
+					Arrays.asList(this.context.getName(), this.percept.getName(), "SET END", "" + newEndValue)));
+			
 			lastEndTickModification = context.getAmas().getCycle();
 			this.percept.updateContextProjectionEnd(this.context);
 			context.getAmas().addLastmodifiedContext(context);
@@ -1551,11 +1562,10 @@ public class Range implements Serializable, Comparable, Cloneable {
 
 			this.context.updateActivatedContextsCopyForUpdate();
 
-			world.trace(new ArrayList<String>(
-					Arrays.asList(this.context.getName(), this.percept.getName(), "SET END", "" + newEndValue)));
+			
 
-			if (!this.context.isDying() && !context.getAmas().getSpatiallyAlteredContext().contains(this.context)) {
-				context.getAmas().addSpatiallyAlteredContext(this.context);
+			if (!this.context.isDying() && !context.getAmas().getSpatiallyAlteredContextForUnityUI().contains(this.context)) {
+				context.getAmas().addSpatiallyAlteredContextForUnityUI(this.context);
 			}
 		}
 
diff --git a/AMOEBAonAMAK/src/agents/context/localModel/LocalModelMillerRegression.java b/AMOEBAonAMAK/src/agents/context/localModel/LocalModelMillerRegression.java
index 33f6d9a69acec7e4c4c8af5ad65f1d1fe2150d9c..87998fe51fe7f0fbd06036fa3e26bf74c662f8b9 100644
--- a/AMOEBAonAMAK/src/agents/context/localModel/LocalModelMillerRegression.java
+++ b/AMOEBAonAMAK/src/agents/context/localModel/LocalModelMillerRegression.java
@@ -8,6 +8,7 @@ import agents.context.Context;
 import agents.context.Experiment;
 import agents.percept.Percept;
 import utils.Pair;
+import utils.TRACE_LEVEL;
 
 // TODO: Auto-generated Javadoc
 /**
@@ -249,7 +250,8 @@ public class LocalModelMillerRegression extends LocalModel{
 	
 	
 	public void updateModel(Experiment newExperiment, double weight, int numberOfPointsForRegression) {
-		context.getAmas().getEnvironment().trace(new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "OLD MODEL :", coefsToString()))); 
+		context.getAmas().getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "OLD MODEL :", coefsToString()))); 
+		
 		if(firstExperiments.size()< (nParameters + 2)) {
 			firstExperiments.add(newExperiment); 
 			updateModel();
@@ -258,8 +260,8 @@ public class LocalModelMillerRegression extends LocalModel{
 			updateModelWithExperimentAndWeight(newExperiment, weight, numberOfPointsForRegression);
 		}
 		
-		
-		context.getAmas().getEnvironment().trace(new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "MODEL :", coefsToString()))); 
+		context.getAmas().addSpatiallyAlteredContextForUnityUI(context);
+		context.getAmas().getEnvironment().trace(TRACE_LEVEL.INFORM,new ArrayList<String>(Arrays.asList(context.getName(),"NEW POINT REGRESSION", "FIRST POINTS :", ""+firstExperiments.size(), "MODEL :", coefsToString()))); 
 	}
 	
 	public void updateModel() {
diff --git a/AMOEBAonAMAK/src/agents/head/EndogenousRequest.java b/AMOEBAonAMAK/src/agents/head/EndogenousRequest.java
index cf949f0be04caa310ac02eee908519083ebf5102..e6c7ea98015042a6cc07c5e84d199b729cb16343 100644
--- a/AMOEBAonAMAK/src/agents/head/EndogenousRequest.java
+++ b/AMOEBAonAMAK/src/agents/head/EndogenousRequest.java
@@ -3,22 +3,28 @@ package agents.head;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.Iterator;
 
 import org.junit.platform.commons.util.ToStringBuilder;
 
 import agents.context.Context;
+import agents.percept.Percept;
+import utils.Pair;
 
 public class EndogenousRequest {
 	
 	
 	private Integer priority;
-	private HashMap<String, Double> request;
+	private HashMap<Percept, Double> request;
+	private HashMap<Percept, Pair<Double, Double>> bounds;
 	private ArrayList<Context> askingContexts;
 	private String name;
+	private REQUEST requestType;
 	
-	public EndogenousRequest(HashMap<String, Double> rqst, int prty, ArrayList<Context> contexts) {
+	public EndogenousRequest(HashMap<Percept, Double> rqst, HashMap<Percept, Pair<Double, Double>> bnds, int prty, ArrayList<Context> contexts, REQUEST type) {
 	
 		request = rqst;
+		bounds = bnds;
 		priority = prty;
 		askingContexts = contexts;
 		
@@ -27,9 +33,11 @@ public class EndogenousRequest {
 		for(Context ctxt: askingContexts) {
 			name += ctxt.getName();
 		}
+		
+		requestType = type;
 	}
 	
-	public EndogenousRequest(HashMap<String, Double> rqst, Integer prty) {
+	public EndogenousRequest(HashMap<Percept, Double> rqst, Integer prty) {
 		
 		request = rqst;
 		priority = prty;
@@ -39,17 +47,18 @@ public class EndogenousRequest {
 		return priority;
 	}
 	
-	public HashMap<String, Double> getRequest(){
+	public HashMap<Percept, Double> getRequest(){
 		return request;
 	}
 	
 	public String toString() {
-		String m="";
+		String m="ASK BY ";
 		for(Context ctxt : askingContexts) {
 			m+= ctxt.getName() + " ";
 		}
 		m+=priority + " ";
-		m+= request;
+		m+= request + " ";
+		m+= requestType;
 		return m;
 	} 
 	
@@ -69,6 +78,25 @@ public class EndogenousRequest {
 		return test;
 	}
 	
+	public boolean requestInBounds(HashMap<Percept, Double> rqt) {
+		boolean test = true;
+		
+		
+		Iterator<Percept> it = rqt.keySet().iterator();
+		
+		while(test && it.hasNext()) {
+			Percept pct = (Percept) it.next();
+			test = test && ( (bounds.get(pct).getA() < rqt.get(pct))  &&  (rqt.get(pct) < bounds.get(pct).getB() ));
+		}
+		
+		
+		return test;
+	}
+	
+	public REQUEST getType() {
+		return requestType;
+	}
+	
 	
 	
 }
diff --git a/AMOEBAonAMAK/src/agents/head/Head.java b/AMOEBAonAMAK/src/agents/head/Head.java
index 61101743d8ac488b42dfec53cade0a761391f1d4..5c003f286b7b0c8cd98cf807e993b55b46cbe4ed 100644
--- a/AMOEBAonAMAK/src/agents/head/Head.java
+++ b/AMOEBAonAMAK/src/agents/head/Head.java
@@ -5,8 +5,8 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Iterator;
+import java.util.List;
 import java.util.PriorityQueue;
 import java.util.Queue;
 
@@ -20,6 +20,7 @@ import utils.Pair;
 import utils.PickRandom;
 import utils.PrintOnce;
 import utils.Quadruplet;
+import utils.TRACE_LEVEL;
 
 /**
  * The Class Head.
@@ -145,8 +146,12 @@ public class Head extends AmoebaAgent {
 	private void playWithOracle() {
 
 		getAmas().data.executionTimes[0]=System.currentTimeMillis();
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("\n------------------------------------------------------------------------------------"
+				+ "---------------------------------------- PLAY WITH ORACLE")));
+		
 		if (activatedContexts.size() > 0) {
-			selectBestContext(); // using highest confidence
+			//selectBestContext(); // using highest confidence
+			selectBestContextWithDistanceToModel(); // using closest distance
 			// selectBestContextWithDistanceToModel();
 		} else {
 			bestContext = lastUsedContext;
@@ -167,11 +172,12 @@ public class Head extends AmoebaAgent {
 		/* If we have a bestcontext, send a selection message to it */
 		if (bestContext != null) {
 			bestContext.notifySelection();
-			getEnvironment().trace(new ArrayList<String>(Arrays.asList(bestContext.getName(),
+			getEnvironment().trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList(bestContext.getName(),
 					"*********************************************************************************************************** BEST CONTEXT")));
 		}
 
 		getAmas().data.executionTimes[0]=System.currentTimeMillis()- getAmas().data.executionTimes[0];
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 1", "" + (bestContext != null))));
 
 		getAmas().data.executionTimes[1]=System.currentTimeMillis();
 		// endogenousPlay();
@@ -181,6 +187,7 @@ public class Head extends AmoebaAgent {
 		selfAnalysationOfContexts4();
 		getAmas().data.executionTimes[2]=System.currentTimeMillis()- getAmas().data.executionTimes[2];
 		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 2", "" + (bestContext != null))));
 
 		getAmas().data.executionTimes[3]=System.currentTimeMillis();
 		NCSDetection_IncompetentHead(); /*
@@ -191,6 +198,7 @@ public class Head extends AmoebaAgent {
 		
 
 		getAmas().data.executionTimes[4]=System.currentTimeMillis();
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 3", "" + (bestContext != null))));
 		NCSDetection_Concurrence(); /* If result is good, shrink redundant context (concurrence NCS) */
 		getAmas().data.executionTimes[4]=System.currentTimeMillis()- getAmas().data.executionTimes[4];
 
@@ -207,7 +215,8 @@ public class Head extends AmoebaAgent {
 		
 		NCSDetection_ChildContext();
 		
-		NCSDetection_PotentialRequest();
+		//if(getAmas().getCycle()>1000)
+		//NCSDetection_PotentialRequest();
 		
 		criticalities.addCriticality("spatialCriticality",
 				(getMinMaxVolume() - getVolumeOfAllContexts()) / getMinMaxVolume());
@@ -781,6 +790,9 @@ public class Head extends AmoebaAgent {
 	
 	private void NCSDetection_ChildContext() {
 		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+				+ "---------------------------------------- NCS DETECTION CHILD CONTEXT")));
+		
 		if(bestContext!=null) {
 			if(!bestContext.getLocalModel().finishedFirstExperiments() && getAmas().data.firstContext && getAmas().getCycle()>0 && !bestContext.isDying()) {
 				bestContext.solveNCS_ChildContext();
@@ -823,14 +835,15 @@ public class Head extends AmoebaAgent {
 	private void NCSDetection_Create_New_Context() {
 		/* Finally, head agent check the need for a new context agent */
 
-		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+				+ "---------------------------------------- NCS DETECTION CREATE NEX CONTEXT")));
 		
 		
 		boolean newContextCreated = false;
 		getAmas().data.executionTimes[9]=System.currentTimeMillis();
 		if (activatedContexts.size() == 0) {
 			
-			getEnvironment().trace(new ArrayList<String>(Arrays.asList(
+			getEnvironment().trace(TRACE_LEVEL.NCS, new ArrayList<String>(Arrays.asList(
 					"*********************************************************************************************************** SOLVE NCS CREATE NEW CONTEXT")));
 			
 			getAmas().data.executionTimes[8]=System.currentTimeMillis();		
@@ -841,7 +854,7 @@ public class Head extends AmoebaAgent {
 			
 			Context context;
 			if (nearestGoodContext.getA() != null) {
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList(nearestGoodContext.getA().getName(),
+				getEnvironment().trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList(nearestGoodContext.getA().getName(),
 						"************************************* NEAREST GOOD CONTEXT")));
 				context = createNewContext(nearestGoodContext.getA());
 			} else {
@@ -872,6 +885,9 @@ public class Head extends AmoebaAgent {
 	}
 
 	private void NCSDetection_Context_Overmapping() {
+		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+				+ "---------------------------------------- NCS DETECTION OVERMAPPING")));
 
 		ArrayList<Context> activatedContextsCopy = new ArrayList<Context>();
 		activatedContextsCopy.addAll(activatedContexts);
@@ -885,16 +901,33 @@ public class Head extends AmoebaAgent {
 	}
 
 	private void NCSDetection_Concurrence() {
-		/* If result is good, shrink redundant context (concurrence NCS) */
-		if (bestContext != null && getAmas().data.criticity <= getAmas().data.predictionPerformance.getPerformanceIndicator()) {
+		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+				+ "---------------------------------------- NCS DETECTION CONCURRENCE")));
+		
+		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null", "" + (bestContext != null))));
+		
+		if(bestContext != null) {
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext.getLocalModel().distance(bestContext.getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()", "" + (bestContext.getLocalModel().distance(bestContext.getCurrentExperiment()) < getAverageRegressionPerformanceIndicator() ))));
+			
+		}
+		
 
-			for (int i = 0; i < activatedContexts.size(); i++) {
+		/* If result is good, shrink redundant context (concurrence NCS) */
+		if (bestContext != null && bestContext.getLocalModel().distance(bestContext.getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()) {
+		//if (bestContext != null && criticity <= predictionPerformance.getPerformanceIndicator()) {
 
-				if (activatedContexts.get(i) != bestContext && !activatedContexts.get(i).isDying() && this
-						.getCriticity(activatedContexts.get(i)) <= getAmas().data.predictionPerformance.getPerformanceIndicator()) {
+				for (int i = 0; i<activatedContexts.size();i++) {
+					
+					getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("activatedContexts.get(i) != bestContext", "" + ( activatedContexts.get(i) != bestContext))));
+					getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("!activatedContexts.get(i).isDying()", "" + ( !activatedContexts.get(i).isDying()))));
+					getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("", "" + ( activatedContexts.get(i).getLocalModel().distance(activatedContexts.get(i).getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()))));
 
-					activatedContexts.get(i).solveNCS_Concurrence(this);
-				}
+					if (activatedContexts.get(i) != bestContext && !activatedContexts.get(i).isDying() && activatedContexts.get(i).getLocalModel().distance(activatedContexts.get(i).getCurrentExperiment()) < getAverageRegressionPerformanceIndicator()) {
+		
+						activatedContexts.get(i).solveNCS_Concurrence(this);
+					}
 			}
 		}
 	}
@@ -904,15 +937,28 @@ public class Head extends AmoebaAgent {
 		 * If there isn't any proposition or only bad propositions, the head is
 		 * incompetent. It needs help from a context.
 		 */
-		if (activatedContexts.isEmpty()
-				|| (getAmas().data.criticity > getAmas().data.predictionPerformance.getPerformanceIndicator() && !oneOfProposedContextWasGood())) {
+		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+				+ "---------------------------------------- NCS DETECTION INCOMPETENT HEAD")));
+		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 22", "" + (bestContext != null))));
+		if(activatedContexts.isEmpty()	|| ((bestContext.getLocalModel().distance(bestContext.getCurrentExperiment())) > bestContext.regressionPerformance.getPerformanceIndicator() && !oneOfProposedContextWasGood())) {
 
+			
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 23", "" + (bestContext != null))));
 			Context c = getNearestGoodContext(activatedNeighborsContexts);
 			// Context c = getSmallestGoodContext(activatedNeighborsContexts);
 
-			if (c != null)
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 24", "" + (bestContext != null))));
+			
+			if (c != null) {
 				c.solveNCS_IncompetentHead(this);
+			}
+				
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 25", "" + (bestContext != null))));
 			bestContext = c;
+			
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("bestContext != null 26", "" + (bestContext != null))));
 
 			/* This allow to test for all contexts rather than the nearest */
 			/*
@@ -929,6 +975,9 @@ public class Head extends AmoebaAgent {
 	
 	private void NCSDetection_PotentialRequest() {
 		
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+				+ "---------------------------------------- NCS DETECTION POTENTIAL REQUESTS")));
+		
 		
 
 		
@@ -945,7 +994,7 @@ public class Head extends AmoebaAgent {
 						
 						if(potentialRequest != null) {
 							addEndogenousRequest(potentialRequest);
-							getEnvironment().trace(new ArrayList<String>(Arrays.asList("NEW ENDO REQUEST", ""+potentialRequest)));
+							
 						}
 					}
 					
@@ -955,12 +1004,12 @@ public class Head extends AmoebaAgent {
 			}
 		}
 		
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList("ENDO REQUESTS", ""+endogenousRequests.size())));
-//		for(EndogenousRequest endoRequest : endogenousRequests) {
-//			
-//			System.out.println(endoRequest);
-//			
-//		}
+		getEnvironment().trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("ENDO REQUESTS", ""+endogenousRequests.size())));
+		for(EndogenousRequest endoRequest : endogenousRequests) {
+			
+			getEnvironment().trace(TRACE_LEVEL.STATE, new ArrayList<String>(Arrays.asList("" + endoRequest)));
+			
+		}
 		
 	}
 
@@ -1046,6 +1095,9 @@ public class Head extends AmoebaAgent {
 
 	private void selfAnalysationOfContexts4() {
 
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("------------------------------------------------------------------------------------"
+				+ "---------------------------------------- SELF ANALYSIS OF CTXT")));
+		
 		double currentDistanceToOraclePrediction;
 		Context closestContextToOracle = null;
 		double minDistanceToOraclePrediction = Double.POSITIVE_INFINITY;
@@ -1056,7 +1108,7 @@ public class Head extends AmoebaAgent {
 			getAmas().data.distanceToRegression = currentDistanceToOraclePrediction;
 
 			getAmas().data.contextNotFinished = false;
-			getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContext.getName(),
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContext.getName(),
 					"" + activatedContext.getLocalModel().distance(activatedContext.getCurrentExperiment()))));
 			if (!activatedContext.getLocalModel().finishedFirstExperiments()) {
 				activatedContext.getLocalModel().updateModel(activatedContext.getCurrentExperiment(), getAmas().data.learningSpeed,
@@ -1086,22 +1138,24 @@ public class Head extends AmoebaAgent {
 
 		}
 
-		activatedContextsCopyForUpdates = new ArrayList<Context>(activatedContexts);
-		for (Context activatedContext : activatedContexts) {
+		
+		
+		for (int i = 0; i< activatedContexts.size() ; i++) {
 			
-			activatedContext.criticalities.updateMeans();
+			activatedContexts.get(i).criticalities.updateMeans();
 			
-			if (activatedContext.criticalities.getCriticalityMean("distanceToRegression") != null) {
-				activatedContext.regressionPerformance.update(activatedContext.criticalities.getCriticalityMean("distanceToRegression"));
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("UPDATE REGRESSION PERFORMANCE", activatedContext.getName(), ""+activatedContext.regressionPerformance.getPerformanceIndicator())));
+			if (activatedContexts.get(i).criticalities.getCriticalityMean("distanceToRegression") != null) {
+				activatedContexts.get(i).regressionPerformance.update(activatedContexts.get(i).criticalities.getCriticalityMean("distanceToRegression"));
+				getEnvironment().trace(TRACE_LEVEL.INFORM, new ArrayList<String>(Arrays.asList("UPDATE REGRESSION PERFORMANCE", activatedContexts.get(i).getName(), ""+activatedContexts.get(i).regressionPerformance.getPerformanceIndicator())));
 			}
 			
 			
-			activatedContext.analyzeResults4(this, closestContextToOracle);
+			activatedContexts.get(i).analyzeResults4(this);
 
 		}
-		activatedContexts = activatedContextsCopyForUpdates;
+		
 
+		getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("NCS DECTECTION USELESSNESS IN SELF ANALISIS")));
 		for (Context ctxt : activatedNeighborsContexts) {
 
 			if (!activatedContexts.contains(ctxt)) {
@@ -1124,14 +1178,14 @@ public class Head extends AmoebaAgent {
 					.abs(distanceToOracleForActivatedContext - closestAndFarestContextsToPredictionWithDistance.getD());
 
 			if (distanceToMin < distanceToMax) {
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE",
+				getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE",
 						activatedContexts.get(0).getName(), "" + distanceToOracleForActivatedContext)));
 				activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),
 						getAmas().data.learningSpeed, getAmas().data.numberOfPointsForRegression);
 
 			}
 		} else {
-			getEnvironment().trace(new ArrayList<String>(
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(
 					Arrays.asList("MODEL DISTANCE", activatedContexts.get(0).getName(), "" + activatedContexts.get(0)
 							.getLocalModel().distance(activatedContexts.get(0).getCurrentExperiment()))));
 			activatedContexts.get(0).getLocalModel().updateModel(activatedContexts.get(0).getCurrentExperiment(),
@@ -1153,7 +1207,7 @@ public class Head extends AmoebaAgent {
 			if (contextNeighbor != activatedContexts.get(0)) {
 				currentDistanceToOraclePrediction = contextNeighbor.getLocalModel()
 						.distance(contextNeighbor.getCurrentExperiment());
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(),
+				getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(),
 						"" + currentDistanceToOraclePrediction)));
 				if (currentDistanceToOraclePrediction > maxDistanceToOraclePredictionInNeighbors) {
 					maxDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
@@ -1172,7 +1226,7 @@ public class Head extends AmoebaAgent {
 			if (contextNeighbor != activatedContexts.get(0)) {
 				currentDistanceToOraclePrediction = contextNeighbor.getLocalModel()
 						.distance(contextNeighbor.getCurrentExperiment());
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(),
+				getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(),
 						"" + currentDistanceToOraclePrediction)));
 				if (currentDistanceToOraclePrediction < minDistanceToOraclePredictionInNeighbors) {
 					minDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
@@ -1194,7 +1248,7 @@ public class Head extends AmoebaAgent {
 			if (contextNeighbor != activatedContexts.get(0)) {
 				currentDistanceToOraclePrediction = contextNeighbor.getLocalModel()
 						.distance(contextNeighbor.getCurrentExperiment());
-				getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(),
+				getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", contextNeighbor.getName(),
 						"" + currentDistanceToOraclePrediction)));
 				if (currentDistanceToOraclePrediction > maxDistanceToOraclePredictionInNeighbors) {
 					maxDistanceToOraclePredictionInNeighbors = currentDistanceToOraclePrediction;
@@ -1221,7 +1275,7 @@ public class Head extends AmoebaAgent {
 			currentDistanceToOraclePrediction = activatedContext.getLocalModel()
 					.distance(activatedContext.getCurrentExperiment());
 
-			getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContext.getName(),
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE", activatedContext.getName(),
 					"" + activatedContext.getLocalModel().distance(activatedContext.getCurrentExperiment()))));
 			if (currentDistanceToOraclePrediction < minDistanceToOraclePrediction) {
 				minDistanceToOraclePrediction = currentDistanceToOraclePrediction;
@@ -1337,15 +1391,17 @@ public class Head extends AmoebaAgent {
 		double d = Double.MAX_VALUE;
 		Context bestContextInNeighbors = null;
 		
+		Double averageDistanceToModels = getAverageRegressionPerformanceIndicator();
+		
 		for (Context c : contextNeighbors) {
 			
 			double currentDistanceToOraclePrediction = c.getLocalModel()
 					.distance(c.getCurrentExperiment());
 			
-			getEnvironment().trace(new ArrayList<String>(Arrays.asList("MODEL DISTANCE FOR FATHER CTXT", c.getName(),
+			getEnvironment().trace(TRACE_LEVEL.DEBUG, new ArrayList<String>(Arrays.asList("MODEL DISTANCE FOR FATHER CTXT", c.getName(),
 					"" + c.getLocalModel().distance(c.getCurrentExperiment()))));
 			
-			if (currentDistanceToOraclePrediction < getAmas().data.regressionPerformance.getPerformanceIndicator()) {
+			if (currentDistanceToOraclePrediction < averageDistanceToModels) {
 				if(currentDistanceToOraclePrediction < d) {
 					d = currentDistanceToOraclePrediction;
 					bestContextInNeighbors = c;
@@ -1567,6 +1623,8 @@ public class Head extends AmoebaAgent {
 			bestContext = null;
 		}
 	}
+	
+	
 
 	private void selectBestContextWithDistanceToModel() {
 
@@ -2256,9 +2314,13 @@ public class Head extends AmoebaAgent {
 	
 	
 	
-	public HashMap<String, Double> getSelfRequest(){
-		getEnvironment().trace(new ArrayList<String>(Arrays.asList("FUTURE ACTIVE LEARNING", ""+endogenousRequests.element())));
-		return endogenousRequests.poll().getRequest();
+	public HashMap<Percept, Double> getSelfRequest(){
+		getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("FUTURE ACTIVE LEARNING", ""+endogenousRequests.element())));
+		EndogenousRequest futureRequest = endogenousRequests.poll();
+		for(Context ctxt : futureRequest.getAskingContexts()) {
+			ctxt.deleteWaitingRequest(futureRequest);
+		}
+		return futureRequest.getRequest();
 	}
 	
 	public void deleteRequest(Context ctxt) {
@@ -2269,9 +2331,9 @@ public class Head extends AmoebaAgent {
 		return endogenousRequests.size()>0;
 	}
 	
-	public void addSelfRequest(HashMap<String, Double> request, int priority, Context ctxt){		
+	public void addSelfRequest(HashMap<Percept, Double> request, int priority, Context ctxt){		
 		
-		addEndogenousRequest(new EndogenousRequest(request, priority,new ArrayList<Context>(Arrays.asList(ctxt))));
+		addEndogenousRequest(new EndogenousRequest(request, null, priority,new ArrayList<Context>(Arrays.asList(ctxt)), REQUEST.SELF));
 	}
 	
 	public void addEndogenousRequest(EndogenousRequest request) {
@@ -2285,10 +2347,13 @@ public class Head extends AmoebaAgent {
 				
 				EndogenousRequest currentRequest = itr.next();
 				
-				if(currentRequest.getAskingContexts().size()>1) {
+				if(currentRequest.getType() == REQUEST.OVERLAP) {
 						
 					existingRequestTest = existingRequestTest || currentRequest.testIfContextsAlreadyAsked(request.getAskingContexts()); 
 				}
+				if(currentRequest.getType() == REQUEST.VOID) {
+					existingRequestTest = existingRequestTest || currentRequest.requestInBounds(request.getRequest());
+				}
 				
 			}
 			if(!existingRequestTest) {
@@ -2296,9 +2361,12 @@ public class Head extends AmoebaAgent {
 					ctxt.addWaitingRequest(request);
 				}
 				endogenousRequests.add(request);
+				getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEW ADDED ENDO REQUEST", ""+request)));
 			}
 		}else {
+			request.getAskingContexts().get(0).addWaitingRequest(request);
 			endogenousRequests.add(request);
+			getEnvironment().trace(TRACE_LEVEL.EVENT, new ArrayList<String>(Arrays.asList("NEW ADDED ENDO REQUEST", ""+request)));
 		}
 		
 		
@@ -2320,14 +2388,14 @@ public class Head extends AmoebaAgent {
 		}
 	}
 	
-	public boolean isVoid(HashMap<String, Double> request) {
+	public boolean isVoid(HashMap<Percept, Double> request) {
 		boolean test;
 		
 		for(Context ctxt : activatedNeighborsContexts) {
 			
 			test = true;
 			for(Percept pct : getAmas().getPercepts()) {
-				test = test && ctxt.getRanges().get(pct).contains2(request.get(pct.getName()));
+				test = test && ctxt.getRanges().get(pct).contains2(request.get(pct));
 			}
 			if(test) {
 				return false;
@@ -2338,10 +2406,10 @@ public class Head extends AmoebaAgent {
 		
 	}
 	
-	public double getAverageRegressionPerformanceIndicator() {
-		
+	public Double getAverageRegressionPerformanceIndicator() {
 		
-		if(activatedNeighborsContexts.size()>1) {
+		int numberOfRegressions = 0;
+		if(activatedNeighborsContexts.size()>0) {
 			double meanRegressionPerformanceIndicator = 0.0;
 			
 			for(Context ctxt : activatedNeighborsContexts) {
@@ -2349,19 +2417,22 @@ public class Head extends AmoebaAgent {
 
 				if(ctxt.regressionPerformance != null) {
 					meanRegressionPerformanceIndicator += ctxt.regressionPerformance.performanceIndicator;
+					numberOfRegressions+=1;
 				}
 				
 				
 			}
 			
-			return meanRegressionPerformanceIndicator/activatedNeighborsContexts.size();
+			return meanRegressionPerformanceIndicator/numberOfRegressions;
 		}
-		else {
-			return 200;
+		else{
+			return getAmas().data.initRegressionPerformance;
 		}
 		
 	}
 	
+	
+	
 
 	// -----------------
 	// AMOEBAonAMAK ---
diff --git a/AMOEBAonAMAK/src/agents/head/REQUEST.java b/AMOEBAonAMAK/src/agents/head/REQUEST.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cb7d78652523f7ce9f3d3fe3b9ed10f03cf4efe
--- /dev/null
+++ b/AMOEBAonAMAK/src/agents/head/REQUEST.java
@@ -0,0 +1,16 @@
+package agents.head;
+
+import java.io.Serializable;
+
+public enum REQUEST implements Serializable {
+	
+	OVERLAP,
+	VOID,
+	SELF
+	
+}
+
+	
+
+	
+
diff --git a/AMOEBAonAMAK/src/agents/percept/Percept.java b/AMOEBAonAMAK/src/agents/percept/Percept.java
index 9c82b3cb33c58e0fdbf9945a26295088d3497a7c..c58d7e26b8c423973c37f1f709fad22d11362bfe 100644
--- a/AMOEBAonAMAK/src/agents/percept/Percept.java
+++ b/AMOEBAonAMAK/src/agents/percept/Percept.java
@@ -419,6 +419,18 @@ public class Percept extends AmoebaAgent {
 	public double getMappingErrorAllowed() {
 		return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed();
 	}
+	
+	public double getMappingErrorAllowedMin() {
+		return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed() * 0.4;
+	}
+	
+	public double getMappingErrorAllowedOverMapping() {
+		return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed() * 0.5;
+	}
+	
+	public double getMappingErrorAllowedMax() {
+		return getMinMaxDistance() * getEnvironment().getMappingErrorAllowed() * 1.5;
+	}
 
 	// -----------------------
 	// AMOEBAonAMAK code ----
diff --git a/AMOEBAonAMAK/src/experiments/F_XY_System.java b/AMOEBAonAMAK/src/experiments/F_XY_System.java
index d00c161eb53dec5d03ae34d55f7f91b4875f50be..86a0d739f772a9e98e7c03d1aa7b10eaeb764f28 100644
--- a/AMOEBAonAMAK/src/experiments/F_XY_System.java
+++ b/AMOEBAonAMAK/src/experiments/F_XY_System.java
@@ -3,6 +3,7 @@ package experiments;
 import java.util.HashMap;
 import java.util.Random;
 
+import agents.percept.Percept;
 import kernel.StudiedSystem;
 
 /**
@@ -76,7 +77,7 @@ public class F_XY_System implements StudiedSystem {
 	}
 
 	@Override
-	public void setSelfRequest(HashMap<String, Double> request) {
+	public void setSelfRequest(HashMap<Percept, Double> request) {
 		// TODO Auto-generated method stub
 		
 	}
diff --git a/AMOEBAonAMAK/src/experiments/NDimCube.java b/AMOEBAonAMAK/src/experiments/NDimCube.java
index d2400f26ec06abf0bb00f4052278d9c9f97cd28d..8e48b4266d9d9b3c296bd37501d10b6471b7793b 100644
--- a/AMOEBAonAMAK/src/experiments/NDimCube.java
+++ b/AMOEBAonAMAK/src/experiments/NDimCube.java
@@ -3,6 +3,7 @@ package experiments;
 import java.util.HashMap;
 import java.util.Random;
 
+import agents.percept.Percept;
 import fr.irit.smac.amak.tools.Log;
 import kernel.StudiedSystem;
 
@@ -123,7 +124,7 @@ public class NDimCube implements StudiedSystem{
 	}
 
 	@Override
-	public void setSelfRequest(HashMap<String, Double> request) {
+	public void setSelfRequest(HashMap<Percept, Double> request) {
 		// TODO Auto-generated method stub
 		
 	}
diff --git a/AMOEBAonAMAK/src/experiments/TestMain.java b/AMOEBAonAMAK/src/experiments/TestMain.java
index e6b6aab20fd7f2b79cbff5f074c44c5098245a00..0c1edf926c62fdf0692d299b0789045109b12af0 100644
--- a/AMOEBAonAMAK/src/experiments/TestMain.java
+++ b/AMOEBAonAMAK/src/experiments/TestMain.java
@@ -7,6 +7,7 @@ import java.util.PriorityQueue;
 import java.util.Queue;
 
 import agents.head.EndogenousRequest;
+import fr.irit.smac.amak.tools.Log.Level;
  
 
 
@@ -23,16 +24,47 @@ public class TestMain {
 			return n*fact(n-1);
 		}
 	}
+	
+	public enum Level {
+		FATAL(60), ERROR(50), IMPORTANT(40), WARNING(30), INFORM(20), DEBUG(10);
+
+		private final int order;
+
+		Level(final int order) {
+			this.order = order;
+		}
+
+		public boolean isGE(final Level _other) {
+			return order >= _other.order;
+		}
+	}
+	
+	public static Level minLevel = Level.IMPORTANT;
+	
+	private static void trace(final Level _level, final String _message) {
+			if (_level.isGE(minLevel)) {
+				System.out.println(_message);
+			}
+	}
+	
+	
 
 	public static void main(String[] args) {
 		// TODO Auto-generated method stub
 
-		testPriorityQueue();
+		testLvlTrace();
 		
 
 		
 	}
 	
+	public static void testLvlTrace() {
+		trace(Level.DEBUG, "DEBUG");
+		trace(Level.WARNING, "WARNING");
+		trace(Level.ERROR, "ERROR");
+		trace(Level.FATAL, "FATAL");
+	}
+	
 	public static void testPriorityQueue() {
 		
 		Queue<EndogenousRequest> endogenousRequest = new PriorityQueue<EndogenousRequest>(new Comparator<EndogenousRequest>(){
@@ -55,13 +87,13 @@ public class TestMain {
 		hm6.put("p6", 50.0);
 		HashMap<String, Double> hm7 = new HashMap<String, Double>();
 		hm7.put("p7", 50.0);
-		endogenousRequest.add(new EndogenousRequest(hm1, 5));
-		endogenousRequest.add(new EndogenousRequest(hm2, 3));
-		endogenousRequest.add(new EndogenousRequest(hm3, 1));
-		endogenousRequest.add(new EndogenousRequest(hm4, 2));
-		endogenousRequest.add(new EndogenousRequest(hm5, 0));
-		endogenousRequest.add(new EndogenousRequest(hm6, 5));
-		endogenousRequest.add(new EndogenousRequest(hm7, 3));
+//		endogenousRequest.add(new EndogenousRequest(hm1, 5));
+//		endogenousRequest.add(new EndogenousRequest(hm2, 3));
+//		endogenousRequest.add(new EndogenousRequest(hm3, 1));
+//		endogenousRequest.add(new EndogenousRequest(hm4, 2));
+//		endogenousRequest.add(new EndogenousRequest(hm5, 0));
+//		endogenousRequest.add(new EndogenousRequest(hm6, 5));
+//		endogenousRequest.add(new EndogenousRequest(hm7, 3));
 		
 		System.out.println(endogenousRequest);
 		
diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..effe3bbcf7316ef5a328169310f5cce120eca898
--- /dev/null
+++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/Main.java
@@ -0,0 +1,259 @@
+package experiments.UnityLauncher;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.ArrayList;
+
+import agents.context.Context;
+import experiments.FILE;
+import experiments.nDimensionsLaunchers.F_N_Manager;
+import fr.irit.smac.amak.Configuration;
+import gui.AmoebaWindow;
+import kernel.AMOEBA;
+import kernel.StudiedSystem;
+import kernel.backup.BackupSystem;
+import kernel.backup.IBackupSystem;
+import kernel.backup.SaveHelperImpl;
+
+public class Main implements Runnable {
+
+	
+	
+	public static final double oracleNoiseRange = 0.0;
+	public static final double learningSpeed = 0.01;
+	public static final int regressionPoints = 100;
+	public static final int dimension = 3	;
+	public static final double spaceSize = 50.0	;
+	public static final int nbOfModels = 3	;
+	public static final int normType = 2	;
+	public static final boolean randomExploration = false;
+	public static final boolean limitedToSpaceZone = true;
+	public static final double mappingErrorAllowed = 0.03;
+	public static final double explorationIncrement = 1.0	;
+	public static final double explorationWidht = 0.5	;
+	
+	public static final int nbCycle = 10000;
+	
+	private SocketServer server;
+	
+	/* GUI or not */
+	public static final boolean viewer = false;
+	private String message = "";
+	private Boolean shutDown;
+	
+	public Main(ServerSocket ss, Socket s) {
+		
+		server = new SocketServer(ss, s);
+		shutDown = false;
+		
+	}
+	
+	public void run() {
+
+		AmoebaWindow.instance();
+		try {
+			launch();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		
+
+		
+	}
+	
+	public void launch() throws IOException{
+		
+		
+		
+		
+		// Set AMAK configuration before creating an AMOEBA
+		Configuration.commandLineMode = false;
+		Configuration.allowedSimultaneousAgentsExecution = 1;
+		Configuration.waitForGUI = true;
+		Configuration.plotMilliSecondsUpdate = 20000;
+		
+		AMOEBA amoeba = new AMOEBA();
+		StudiedSystem studiedSystem = new F_N_Manager(spaceSize, dimension, nbOfModels, normType, randomExploration, explorationIncrement,explorationWidht,limitedToSpaceZone);
+		amoeba.setStudiedSystem(studiedSystem);
+		IBackupSystem backupSystem = new BackupSystem(amoeba);
+		File file = new File("resources/threeDimensionsLauncherUnity.xml");
+		backupSystem.load(file);
+		
+		
+		amoeba.saver = new SaveHelperImpl(amoeba);
+		amoeba.allowGraphicalScheduler(true);
+		amoeba.setRenderUpdate(true);		
+		amoeba.data.learningSpeed = learningSpeed;
+		amoeba.data.numberOfPointsForRegression = regressionPoints;
+		amoeba.getEnvironment().setMappingErrorAllowed(mappingErrorAllowed);
+		
+		
+		Sender sender = new Sender(server, amoeba);
+
+		studiedSystem.playOneStep();
+		amoeba.learn(studiedSystem.getOutput());
+		
+		
+		
+	
+
+		for (int i = 0; i < nbCycle; ++i) {
+			
+			
+			
+			
+			studiedSystem.playOneStep();
+			amoeba.learn(studiedSystem.getOutput());
+			if(amoeba.getHeadAgent().isActiveLearning()) {
+			
+				studiedSystem.setActiveLearning(true);
+				studiedSystem.setSelfRequest(amoeba.getHeadAgent().getSelfRequest());
+			 
+			}
+			
+			
+			ArrayList<Context> spatiallyAlteredContexts = amoeba.getSpatiallyAlteredContextForUnityUI();
+			ArrayList<Context> toKillContexts = amoeba.getToKillContextsForUnityUI();
+			
+			if(spatiallyAlteredContexts.size()>0) {
+				
+				
+				
+				sender.sendContexts(spatiallyAlteredContexts);
+				
+				while (!sender.acq("CTXTS", amoeba.getCycle())) {
+					try        
+					{
+					    Thread.sleep(10);
+					} 
+					catch(InterruptedException ex) 
+					{
+					    Thread.currentThread().interrupt();
+					}
+				}
+			}
+			
+			if(toKillContexts.size()>0) {
+				
+				sender.sendContextsToKill(toKillContexts);
+				
+				while (!sender.acq("KILL", amoeba.getCycle())) {
+					try        
+					{
+					    Thread.sleep(10);
+					} 
+					catch(InterruptedException ex) 
+					{
+					    Thread.currentThread().interrupt();
+					}
+				}
+			}
+		}
+		
+		
+		
+		
+		
+		
+		
+		/* AUTOMATIC */
+//		long start = System.currentTimeMillis();
+//		for (int i = 0; i < nbCycle; ++i) {
+//			studiedSystem.playOneStep();
+//			amoeba.learn(studiedSystem.getOutput());
+//		}
+//		long end = System.currentTimeMillis();
+//		System.out.println("Done in : " + (end - start) );
+		
+		
+//		/* XP PIERRE */
+//		
+//		String fileName = fileName(new ArrayList<String>(Arrays.asList("GaussiennePierre")));
+//		
+//		FILE Pierrefile = new FILE("Pierre",fileName);
+//		for (int i = 0; i < nbCycle; ++i) {
+//			studiedSystem.playOneStep();
+//			amoeba.learn(studiedSystem.getOutput());
+//			if(amoeba.getHeadAgent().isActiveLearning()) {
+//				studiedSystem.setActiveLearning(true);
+//				studiedSystem.setSelfRequest(amoeba.getHeadAgent().getSelfRequest());
+//				 
+//			}
+//		}
+//		
+//		for (int i = 0; i < 10; ++i) {
+//			studiedSystem.playOneStep();
+//			System.out.println(studiedSystem.getOutput());
+//			System.out.println(amoeba.request(studiedSystem.getOutput()));
+//			
+//			
+//		}
+//		
+//		Pierrefile.write(new ArrayList<String>(Arrays.asList("ID contexte","Coeff Cte","Coeff X0","Coeff X1","Min Value","Max Value")));
+//		
+//		for(Context ctxt : amoeba.getContexts()) {
+//			
+//			writeMessage(Pierrefile, ctxt.toStringArrayPierre());
+//
+//		}
+//		
+//		
+//		Pierrefile.close();
+		
+	
+	}
+	
+	public static String fileName(ArrayList<String> infos) {
+		String fileName = "";
+		
+		for(String info : infos) {
+			fileName += info + "_";
+		}
+		
+		return fileName;
+	}
+	
+	public static void writeMessage(FILE file, ArrayList<String> message) {
+		
+		file.initManualMessage();
+		
+		for(String m : message) {
+			file.addManualMessage(m);
+		}
+		
+		file.sendManualMessage();
+		
+	}
+
+	//////////////////////////////////////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////////////////////////////////////
+	
+	
+	private void quit(){
+		
+		server.close();		
+		shutDown = true;
+	}
+	
+	private void ack(){
+		//System.out.println("ACK...");
+		//message = readMessage();
+		//System.out.println(message);
+		if(!message.contentEquals("")){
+				server.sendMessage("ACK_" + Integer.toString(server.getMessageCounter())); 
+				//System.out.println("ACK");
+		}
+		else{
+			server.sendMessage("ERR_"+Integer.toString(server.getMessageCounter()));
+		}
+	}
+	
+	
+	
+
+}
+
diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java
new file mode 100644
index 0000000000000000000000000000000000000000..583fd1c3bac535aa98b59aec6820f9b4c81793f0
--- /dev/null
+++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/Sender.java
@@ -0,0 +1,68 @@
+package experiments.UnityLauncher;
+
+import java.util.ArrayList;
+
+import agents.context.Context;
+import agents.percept.Percept;
+import kernel.AMOEBA;
+
+
+
+public class Sender {
+
+	AMOEBA amoeba;
+	SocketServer server;
+	
+	public Sender(SocketServer serverInstance,AMOEBA amoebaInstance) {
+		amoeba = amoebaInstance;
+		server = serverInstance;
+	}
+	
+	public void sendContexts(ArrayList<Context> contexts) {
+		ArrayList<Percept> percepts = amoeba.getPercepts();
+		String message = initializeMessage("CTXTS");
+		
+		for(Context ctxt : contexts) {
+			message += "~";
+			message += ctxt.getName() + "_";
+			message += ctxt.getColorForUnity();
+			
+			for(Percept pct : percepts) {
+				message += "_";
+				message += pct.getName() + "#";
+				message += ctxt.getRanges().get(pct).getCenter() + "#";
+				message += ctxt.getRanges().get(pct).getLenght();
+			}
+			
+			
+		}
+		//System.out.println(message);
+		server.sendMessage(message);
+	}
+	
+	public void sendContextsToKill(ArrayList<Context> contexts) {
+		String message = initializeMessage("KILL");
+		
+		for(Context ctxt : contexts) {
+			message += "~" + ctxt.getName();
+			
+			
+		}
+		//System.out.println(message);
+		server.sendMessage(message);
+	}
+	
+	private String initializeMessage(String prefix) {
+		return prefix + "~" + amoeba.getCycle();
+	}
+	
+	public boolean acq(String type, int cycle) {
+		String message = server.readMessage();
+		String[] tokens = message.split("_");
+		return type.equals(tokens[1]) && Integer.parseInt(tokens[2])==cycle;
+	}
+	
+}
+
+
+
diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/ServerLauncher.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/ServerLauncher.java
new file mode 100644
index 0000000000000000000000000000000000000000..56d9f2cea541dc58a639425646af78d006319974
--- /dev/null
+++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/ServerLauncher.java
@@ -0,0 +1,31 @@
+package experiments.UnityLauncher;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+public class ServerLauncher implements Serializable{
+
+	private static ServerSocket socketserver = null;
+	private static Socket socket = null;
+	public static Thread t;
+
+	public static void main(String[] zero) {
+
+		try {
+			socketserver = new ServerSocket(2009);
+			System.out.println("Server ready...");	
+			socket = socketserver.accept(); // Un client se connecte on
+											// l'accepte
+			System.out.println("Client connected...");
+			t = new Thread(new Main(socketserver, socket));
+			t.start();
+
+		} catch (IOException e) {
+			System.err.println("Le port " + socket.getLocalPort() + " est d�j� utilis� !");
+			e.printStackTrace();
+		}
+	}
+	
+}
diff --git a/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java b/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..145587d28cb3d00784af81d1acc9109b7adca5f8
--- /dev/null
+++ b/AMOEBAonAMAK/src/experiments/UnityLauncher/SocketServer.java
@@ -0,0 +1,68 @@
+package experiments.UnityLauncher;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+public class SocketServer {
+
+	private Socket socket = null;
+	private BufferedReader in = null;
+	private PrintWriter out = null;
+	private int counter;
+	
+	public SocketServer(ServerSocket ss, Socket s) {
+		socket = s;
+		counter = 0;
+	}
+	
+	public void sendMessage(String message) {
+		try {
+			// socket = socketserver.accept(); // Un client se connecte on
+			// l'accepte
+			out = new PrintWriter(socket.getOutputStream());
+			out.println(message);
+			out.flush();
+			// out.close();
+
+		} catch (IOException e) {
+			System.err.println("D�connection ");
+		}
+
+	}
+	
+	public void close(){
+			out.close();
+	}
+	
+	public String readMessage() {
+		String message = "";
+		try {
+			// socket = socketserver.accept(); // Un client se connecte on
+			// l'accepte
+			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+			message = in.readLine();
+			//System.out.println(message);
+		} catch (IOException e) {
+			System.err.println("Error getOutPut");
+			e.printStackTrace();
+
+		}
+		
+		counter ++;
+		//System.out.println("MSG :\t" + message);
+		String delimsTags = "[ _~]+";
+		String[] tokens = message.split(delimsTags);
+		
+		return message;
+	}
+	
+	public int getMessageCounter(){
+		return counter;
+	}
+	
+	
+}
diff --git a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java
index dd8eec8e06d319f84820121fbfff7d9d5211946f..44f17659e94c4158cb169a9b2a48759d6eaee801 100644
--- a/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java
+++ b/AMOEBAonAMAK/src/experiments/nDimensionsLaunchers/F_N_Manager.java
@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Random;
 
+import agents.percept.Percept;
 import kernel.StudiedSystem;
 
 
@@ -156,6 +157,8 @@ public class F_N_Manager implements StudiedSystem{
 			
 			activeLearning = false;
 			
+			
+			
 			for(int i = 0 ; i < dimension ; i++) {
 				x[i] = selfRequest.get("px" + i);
 			}
@@ -275,11 +278,11 @@ public class F_N_Manager implements StudiedSystem{
 			return modelN(xRequest);
 		}else if (subzone == 2) {
 			/* Gaussian model */
-			return gaussianModel(xRequest, subZoneCenter2D(2), gaussianCoef, gaussianVariance);
+			return gaussianModel(xRequest, subZoneCenter3D(2), gaussianCoef, gaussianVariance);
 			
 		}else if (subzone == 3) {
 			/* Square */
-			return square2DModel(xRequest, subZoneCenter2D(3));
+			return square2DModel(xRequest, subZoneCenter3D(3));
 			
 		}else if (subzone == 4) {
 			/* Exp */
@@ -366,6 +369,34 @@ public class F_N_Manager implements StudiedSystem{
 		
 	}
 	
+private double[] subZoneCenter3D(int nb) {
+		
+		double[] center =  new double[3];
+		
+		if(nb == 1) {
+			center[0] = spaceSize;
+			center[1] = spaceSize;
+			center[2] = 0.0;
+		}else if(nb == 2) {
+			center[0] = -spaceSize;
+			center[1] = -spaceSize;
+			center[2] = 0.0;
+		}
+		else if(nb == 3) {
+			center[0] = -spaceSize;
+			center[1] = spaceSize;
+			center[2] = 0.0;
+		}
+		else if(nb == 4) {
+			center[0] = spaceSize;
+			center[1] = -spaceSize;
+			center[2] = 0.0;
+		}
+		
+		return center;
+		
+	}
+	
 	private double gaussianMapping2D(Double[] xRequest) {
 		return (xRequest[1] > 30*Math.exp(-(Math.pow((xRequest[0]-spaceSize)/5, 2))/2) -50) ? model1() : model2();
 	}
@@ -410,7 +441,7 @@ public class F_N_Manager implements StudiedSystem{
 		
 		for(int nb = 0; nb<numberOfModels-1; nb++) {
 			
-			if(distance(xRequest,modelCenterZones[nb]) < spaceSize/2) {
+			if(distance(xRequest,modelCenterZones[nb]) < spaceSize*0.75) {
 				return modeli(nb, xRequest);
 			}
 			
@@ -648,8 +679,14 @@ public class F_N_Manager implements StudiedSystem{
 	}
 	
 	@Override
-	public void setSelfRequest(HashMap<String, Double> request){
-		selfRequest = request;
+	public void setSelfRequest(HashMap<Percept, Double> request){
+		HashMap<String,Double> newRequest = new HashMap<String,Double>();
+		
+		for(Percept pct : request.keySet()) {
+			newRequest.put(pct.getName(), request.get(pct));
+		}
+		
+		selfRequest = newRequest;
 	}
 
 
diff --git a/AMOEBAonAMAK/src/gui/ContextRendererFX.java b/AMOEBAonAMAK/src/gui/ContextRendererFX.java
index 1a73a53282fd4575e34490ccea902759c5a56acc..cfe62c32fd7d5c9909ad1710e570cf216962df7f 100644
--- a/AMOEBAonAMAK/src/gui/ContextRendererFX.java
+++ b/AMOEBAonAMAK/src/gui/ContextRendererFX.java
@@ -43,6 +43,11 @@ public class ContextRendererFX extends RenderStrategy {
 		Double[] c = ContextColor.colorFromCoefs(context.getFunction().getCoef());
 		drawable.setColor(new Color(c[0], c[1], c[2], 90d / 255d));
 	}
+	
+	public String getColorForUnity() {
+		Double[] c = ContextColor.colorFromCoefs(context.getFunction().getCoef());
+		 return c[0].intValue() + "," + c[1].intValue() + "," + c[2].intValue() + ",100";
+	}
 
 	private void updatePosition() {
 		Percept p1 = context.getAmas().getDimensionSelector().d1();
diff --git a/AMOEBAonAMAK/src/gui/utils/ContextColor.java b/AMOEBAonAMAK/src/gui/utils/ContextColor.java
index eeb82be0e028e882e9a1fe1ff04a56ba4f713ab2..b58fe9d39a5eb0e7de0496b0afe2812d25003018 100644
--- a/AMOEBAonAMAK/src/gui/utils/ContextColor.java
+++ b/AMOEBAonAMAK/src/gui/utils/ContextColor.java
@@ -78,6 +78,8 @@ public class ContextColor {
 		return ret;
 	}
 	
+	
+	
 	public static double normalizePositiveValues(double upperBound, double dispersion, double value) {
 		return upperBound * 2 * (-0.5 + 1 / (1 + Math.exp(-value / dispersion)));
 	}
diff --git a/AMOEBAonAMAK/src/kernel/AMOEBA.java b/AMOEBAonAMAK/src/kernel/AMOEBA.java
index f85355e2613b8c49861de0c2d198ba9b442a29f8..c243ba19742451b782943ec7b7d7133e4b36b2fc 100644
--- a/AMOEBAonAMAK/src/kernel/AMOEBA.java
+++ b/AMOEBAonAMAK/src/kernel/AMOEBA.java
@@ -69,6 +69,8 @@ public class AMOEBA extends Amas<World> implements IAMOEBA {
 	private int cycleWithoutRender = 0;
 
 	private ArrayList<Context> spatiallyAlteredContext = new ArrayList<>();
+	private ArrayList<Context> toKillContexts = new ArrayList<>();
+	
 	private ArrayList<Context> lastModifiedContext = new ArrayList<>();
 
 	private ArrayList<Context> alteredContexts = new ArrayList<>();
@@ -80,6 +82,7 @@ public class AMOEBA extends Amas<World> implements IAMOEBA {
 	private ReadWriteLock neighborContextsLock = new ReentrantReadWriteLock();
 	
 	public AmoebaData data;
+	private ArrayList<Percept> percepts;
 
 	/**
 	 * Instantiates a new, empty, amoeba.
@@ -221,6 +224,7 @@ public class AMOEBA extends Amas<World> implements IAMOEBA {
 		neighborContexts = null;
 		environment.resetNbActivatedAgent();
 		spatiallyAlteredContext.clear();
+		toKillContexts.clear();
 		lastModifiedContext.clear();
 		alteredContexts.clear();
 		for(Context ctxt : getContexts()) {
@@ -607,13 +611,22 @@ public class AMOEBA extends Amas<World> implements IAMOEBA {
 	}
 
 	public ArrayList<Percept> getPercepts() {
-		ArrayList<Percept> percepts = new ArrayList<>();
-		for (Agent<? extends Amas<World>, World> agent : getAgents()) {
-			if ((agent instanceof Percept)) {
-				percepts.add((Percept) agent);
+		
+		
+		if(percepts == null || percepts.size()==0) {
+			ArrayList<Percept> pcts = new ArrayList<Percept>();
+			for (Agent<? extends Amas<World>, World> agent : getAgents()) {
+				if ((agent instanceof Percept)) {
+					pcts.add((Percept) agent);
+				}
 			}
+			percepts = pcts;
 		}
+			
+		
 		return percepts;
+		
+
 	}
 
 	/**
@@ -697,12 +710,21 @@ public class AMOEBA extends Amas<World> implements IAMOEBA {
 		return head;
 	}
 	
-	public ArrayList<Context> getSpatiallyAlteredContext() {
+	public ArrayList<Context> getSpatiallyAlteredContextForUnityUI() {
 		return spatiallyAlteredContext;
 	}
 	
-	public void addSpatiallyAlteredContext(Context ctxt) {
-		spatiallyAlteredContext.add(ctxt);
+	public void addSpatiallyAlteredContextForUnityUI(Context ctxt) {
+		if(!ctxt.isFlat())
+			spatiallyAlteredContext.add(ctxt);
+	}
+	
+	public ArrayList<Context> getToKillContextsForUnityUI() {
+		return toKillContexts;
+	}
+	
+	public void addToKillContextForUnityUI(Context ctxt) {
+		toKillContexts.add(ctxt);
 	}
 	
 	public void addLastmodifiedContext(Context context) {
@@ -808,5 +830,13 @@ public class AMOEBA extends Amas<World> implements IAMOEBA {
 		return message;
 	}
 	
+	public void setPercepts() {
+		percepts = new ArrayList<Percept>();
+		for (Agent<? extends Amas<World>, World> agent : getAgents()) {
+			if ((agent instanceof Percept)) {
+				percepts.add((Percept) agent);
+			}
+		}
+	}
 	
 }
diff --git a/AMOEBAonAMAK/src/kernel/AmoebaData.java b/AMOEBAonAMAK/src/kernel/AmoebaData.java
index f8fa12276b77b029c06d061c0159bf79dac9955a..d843af0d4cec13c5e5f121d0c9e9de0570364df9 100644
--- a/AMOEBAonAMAK/src/kernel/AmoebaData.java
+++ b/AMOEBAonAMAK/src/kernel/AmoebaData.java
@@ -76,4 +76,6 @@ public class AmoebaData implements Serializable {
 	
 	public double[] executionTimes = new  double[20];
 	public double[] executionTimesSums = new double[20];
+	
+	public double initRegressionPerformance = 1.0;
 }
\ No newline at end of file
diff --git a/AMOEBAonAMAK/src/kernel/StudiedSystem.java b/AMOEBAonAMAK/src/kernel/StudiedSystem.java
index 60f60d3fae6d565ac711b7f1005d9109d7a6724b..0def257b257778365c2639fb813e05a9f3fb324d 100644
--- a/AMOEBAonAMAK/src/kernel/StudiedSystem.java
+++ b/AMOEBAonAMAK/src/kernel/StudiedSystem.java
@@ -39,6 +39,6 @@ public interface StudiedSystem extends Serializable{
 	public void setActiveLearning(boolean value);
 	
 	
-	public void setSelfRequest(HashMap<String, Double> request);
+	public void setSelfRequest(HashMap<Percept, Double> request);
 
 }
diff --git a/AMOEBAonAMAK/src/kernel/World.java b/AMOEBAonAMAK/src/kernel/World.java
index 9bf8193262b79cf09c60bac4fe5f2720d1a1e44b..e248a189449055d43fff29bc5ac33ff3d1e90fdf 100644
--- a/AMOEBAonAMAK/src/kernel/World.java
+++ b/AMOEBAonAMAK/src/kernel/World.java
@@ -7,7 +7,9 @@ import fr.irit.smac.amak.Environment;
 import fr.irit.smac.amak.Scheduling;
 import agents.context.Context;
 import agents.percept.Percept;
+import experiments.TestMain.Level;
 import ncs.NCS;
+import utils.TRACE_LEVEL;
 
 /**
  * Store some data about the world
@@ -30,6 +32,10 @@ public class World extends Environment {
 	
 	public int regressionPoints = 0; // TODO remove from here
 	
+	
+	
+	public static TRACE_LEVEL minLevel = TRACE_LEVEL.ERROR;
+	
 	private AMOEBA amoeba;
 
 	/**
@@ -73,12 +79,15 @@ public class World extends Environment {
 		}
 	}
 	
-	public void trace(ArrayList<String> infos) {
-		String message = "" +amoeba.getCycle();
-		for(String info : infos) {
-			message += " " + info;
+	public void trace(TRACE_LEVEL lvl, ArrayList<String> infos) {
+		if (lvl.isGE(minLevel)) {
+			String message = "[" +amoeba.getCycle() + "]";
+			for(String info : infos) {
+				message += " " + info;
+			}
+			System.out.println(message);
 		}
-		System.out.println(message);
+		
 	}
 
 	public double getAVT_acceleration() {
diff --git a/AMOEBAonAMAK/src/utils/TRACE_LEVEL.java b/AMOEBAonAMAK/src/utils/TRACE_LEVEL.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc2da4ad5f98cbdfc9969723dcc707528bba233d
--- /dev/null
+++ b/AMOEBAonAMAK/src/utils/TRACE_LEVEL.java
@@ -0,0 +1,15 @@
+package utils;
+
+public enum TRACE_LEVEL {
+	ERROR(200), NCS(100), EVENT(50), STATE(40), INFORM(20), DEBUG(0);
+
+	private final int order;
+
+	TRACE_LEVEL(final int order) {
+		this.order = order;
+	}
+
+	public boolean isGE(final TRACE_LEVEL _other) {
+		return order >= _other.order;
+	}
+}