Index: tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/handlers/base/CreatePartition.java
===================================================================
--- tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/handlers/base/CreatePartition.java	(revision 1137)
+++ tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/handlers/base/CreatePartition.java	(revision 1138)
@@ -103,7 +103,7 @@
 							}
 							monitor.worked(95);
 
-							Log.info(NLS.bind(TXMUIMessages.CreatePartition_6, partition.getNPart()));
+							Log.info(NLS.bind(TXMUIMessages.CreatePartition_6, partition.getPartsCount()));
 							
 							monitor.subTask(TXMUIMessages.RefreshingCorporaView);
 							syncExec(new Runnable() {
Index: tmp/org.txm.chartsengine.core/src/org/txm/chartsengine/core/results/ChartResult.java
===================================================================
--- tmp/org.txm.chartsengine.core/src/org/txm/chartsengine/core/results/ChartResult.java	(revision 1137)
+++ tmp/org.txm.chartsengine.core/src/org/txm/chartsengine/core/results/ChartResult.java	(revision 1138)
@@ -4,6 +4,7 @@
 package org.txm.chartsengine.core.results;
 
 import java.lang.reflect.Field;
+import java.util.HashMap;
 import java.util.List;
 
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -141,7 +142,7 @@
 	@Override
 	public void setDirty() {
 		super.setDirty();
-//		this.chart = null;
+		this.chart = null;
 		this.setChartDirty();
 	}
 
@@ -154,8 +155,8 @@
 
 
 	@Override
-	public void setHasBeenComputedOnce(boolean hasBeenComputedOnce) {
-		super.setHasBeenComputedOnce(hasBeenComputedOnce);
+	public void setNeedsFullRecomputing(boolean needsFullRecomputing) {
+		super.setNeedsFullRecomputing(needsFullRecomputing);
 		this.chart = null;
 	}
 	
@@ -165,7 +166,7 @@
 		Log.finest("ChartResult.compute(): computing result of type " + this.getClass() + "...");
 
 		// compute the result if needed
-		if(super.compute(monitor, true, false))	{
+		if(super.compute(monitor, true))	{
 			// compute the chart
 			return renderChart();
 		}
@@ -175,7 +176,20 @@
 
 	}
 	
+	
+	@Override
+	public boolean hasParameterChanged(String key) {
+		HashMap<String, Object> lastParameters = this.lastParameters;
+		if(this.parametersHistory.size() > 1)	{
+			lastParameters = this.parametersHistory.get(this.parametersHistory.size() - 2);
+		}
+		
+		return this.hasParameterChanged(key, lastParameters);
+	}
+	
 	/**
+	 * Renders the chart using the right chart creator.
+	 * The chart is created if needed then it is updated.
 	 * 
 	 * @return true if the chart has been rendered
 	 * @throws Exception
@@ -512,20 +526,7 @@
 	}
 
 
-	/**
-	 * Checks if a preference is empty (equals to "") in the command preference node.
-	 * An empty preference can be used to disable a functionality for a kind of result
-	 * (eg. A partition dimension bar chart does not have a legend so it can be used to not offer the hide/show legend button in UI).
-	 * @param key
-	 * @return
-	 */
-	public boolean isEmptyPreference(String key)	{
-		return TXMPreferences.isEmpty(this.commandPreferencesNodePath, key);
-	}
 
-	
-
-
 	/**
 	 * @return the monoStyle
 	 */
Index: tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Partition.java
===================================================================
--- tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Partition.java	(revision 1137)
+++ tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Partition.java	(revision 1138)
@@ -82,42 +82,24 @@
 	protected StructuralUnitProperty pProperty;
 	
 	/**
-	 * the parts property values to use, may be null
+	 * The parts property values to use, may be null.
 	 */
 	@Parameter(key=TXMPreferences.VALUES)
 	protected List<String> pValues;
 	
 	/**
-	 * the parts queries
+	 * The parts queries
 	 */
 	@Parameter(key=TXMPreferences.QUERIES)
 	protected List<String> pQueries;
 	
 	/**
-	 * the parts names -> do the parts order
+	 * The parts names -> do the parts order
 	 */
 	@Parameter(key=CQPPreferences.PART_NAMES)
 	protected List<String> pPartNames;
 	
-	/**
-	 * the partition name to set
-	 */
-	@Parameter(key=TXMPreferences.LAZY_NAME)
-	protected String pName;
 	
-	//	/**
-	//	 * Create a partition with a set of raw queries.
-	//	 *
-	//	 * @param corpus the corpus
-	//	 * @param name the name
-	//	 * @param queries the queries
-	//	 * @throws CqiClientException the cqi client exception
-	//	 * @author Sylvain Loiseau
-	//	 */
-	//	protected Partition(Corpus corpus, String name, List<String> queries) throws CqiClientException {
-	//		this(corpus, name, queries, null);
-	//	}
-
 	/**
 	 * 
 	 * @param parent
@@ -146,11 +128,11 @@
 	 */
 	public boolean _compute_with_lists() throws Exception {
 
-		if (pName == null || pName.length() == 0) {
-			pName = "no_name";
+		if (this.userName == null || this.userName.length() == 0) {
+			this.userName = "no_name";
 		}
 		
-		Log.info(NLS.bind(TXMCoreMessages.info_creatingNewPartition, this.getParent(), this.pName));
+		Log.info(NLS.bind(TXMCoreMessages.info_creatingNewPartition, this.getParent(), this.userName));
 		long start = System.currentTimeMillis();
 		for (int i = 0; i < pQueries.size(); i++) {
 			String queryS = pQueries.get(i);
@@ -163,10 +145,10 @@
 				partName = "-"; //$NON-NLS-1$
 			}
 
-			Part part = this.createPart(this.getName(), partName, queryS); // lazy
+			this.addChild(new Part(this, partName, queryS));
 		}
 		long end = System.currentTimeMillis();
-		Log.info(NLS.bind(TXMCoreMessages.info_partitionCreatedInXMs, this.pName, (end - start)));
+		Log.info(NLS.bind(TXMCoreMessages.info_partitionCreatedInXMs, this.userName, (end - start)));
 
 		return pQueries.size() > 0;
 	}
@@ -179,22 +161,18 @@
 	 * part is composed by all the structure <code>structure</code> such as
 	 * <code>strucutre.getValue(property) == values.get(i)<code>
 	 * 
-	 * @param corpus
-	 *            the corpus
-	 * @param structure
-	 *            the structure
-	 * @param property
-	 *            the property
-	 * @param values
-	 *            the values, raw values special chars will be backslashed
+	 * @param corpus the corpus
+	 * @param structure the structure
+	 * @param property the property
+	 * @param values the values, raw values special chars will be backslashed
 	 * @throws Exception 
 	 */
 
 	protected boolean _compute_with_property()	throws Exception {
 
-		CQPCorpus corpus = getParent();
-		if (pName == null || pName.length() == 0) {
-			pName = corpus.getName() + "_" + pProperty.getFullName(); //$NON-NLS-1$
+		CQPCorpus corpus = this.getParent();
+		if (this.userName == null || this.userName.length() == 0) {
+			this.userName = corpus.getName() + "_" + pProperty.getFullName(); //$NON-NLS-1$
 		}
 
 		if (pValues == null) {
@@ -210,7 +188,8 @@
 		}
 		if (type == null || type.trim().length() == 0 || type.equals("String")) { //$NON-NLS-1$
 			Collections.sort(pValues, Collator.getInstance(Locale.getDefault())); // alpha sort
-		} else if (type.equals("Integer")) { //$NON-NLS-1$
+		}
+		else if (type.equals("Integer")) { //$NON-NLS-1$
 			Collections.sort(pValues, new Comparator<String>() {
 				@Override
 				public int compare(String arg0, String arg1) {
@@ -219,7 +198,8 @@
 					return i0 - i1;
 				}
 			}); 
-		} else if (type.equals("Date")) { //$NON-NLS-1$
+		}
+		else if (type.equals("Date")) { //$NON-NLS-1$
 			String format = infos.get("inputFormat"); //$NON-NLS-1$
 			final DateFormat formater = new SimpleDateFormat(format);
 			Collections.sort(pValues, new Comparator<String>() {
@@ -234,7 +214,8 @@
 					}
 				}
 			}); 
-		} else if (type.contains("|")){ //$NON-NLS-1$
+		}
+		else if (type.contains("|")){ //$NON-NLS-1$
 			final List<String> sortedValues = Arrays.asList(type.split("\\|")); //$NON-NLS-1$
 			Collections.sort(pValues, new Comparator<String>() {
 				@Override
@@ -262,21 +243,27 @@
 	@Override
 	protected boolean _compute() throws Exception {
 
-		if (getParts().size() > 0) return true; // Parts already created
+		 // Parts already created
+		if (this.getParts().size() > 0) {
+//			//FIXME: temporary fix, compute all the children parts
+//			List<Part> parts = (List<Part>)getChildren(Part.class);
+//			for (int i = 0; i < parts.size(); i++) {
+//				if(!parts.get(i).hasBeenComputedOnce())	{
+//					parts.get(i).compute(this, true);
+//				}
+//			}
+			return true;
+		}
 		
-		Log.finest(NLS.bind(TXMCoreMessages.info_creatingNewPartition, this.getParent(), this.pName));
+		Log.finest(NLS.bind(TXMCoreMessages.info_creatingNewPartition, this.getParent(), this.userName));
 		
-		if (pProperty != null) {
+		if (this.pProperty != null) {
 			_compute_with_property();
-		} else {
+		}
+		else {
 			_compute_with_lists();
 		}
 		
-		//FIXME: temporary fix, compute all the children parts
-//		List<Part> parts = (List<Part>)getChildren(Part.class);
-//		for (int i = 0; i < parts.size(); i++) {
-//			parts.get(i).compute(this, true);
-//		}
 		
 		return true;
 	}
@@ -318,7 +305,7 @@
 
 	@Override
 	public boolean canCompute() {
-		return getParent() != null && (pProperty != null || (pQueries != null && pQueries.size() > 0));
+		return this.getParent() != null && (this.pProperty != null || (this.pQueries != null && this.pQueries.size() > 0));
 	}
 
 	@Override
@@ -337,72 +324,59 @@
 		return output;
 	}
 
-	/**
-	 * TODO Part should be create lazily
-	 * 
-	 * Create a part with a raw query.
-	 *
-	 * @param partitionName the partition name
-	 * @param partName the part name
-	 * @param query the query
-	 * @return the part
-	 * @throws CqiClientException the cqi client exception
-	 * 
-	 * @author Sylvain Loiseau, mdecorde
-	 */
-	public Part createPart(String partitionName, String partName, String query) throws CqiClientException {
-		Part part;
-		String partCqpId = CqpObject.partNamePrefix + CQPCorpus.getNextSubcorpusCounter();
-		Log.finest(NLS.bind(TXMCoreMessages.CREATING_PART, partName, query));
-		long start = System.currentTimeMillis();
-		try {
-			CorpusManager.getCorpusManager().getCqiClient().cqpQuery(this.getParent().getQualifiedCqpId(), partCqpId, query);
-			part = new Part(this);
-			part.setParameters(partCqpId, partName, new CQLQuery(query));
-			part.compute();
-			// FIXME: persistence tests: define the UUID as the concatenation of all part CQP id
-//			this.uniqueID += partCqpId;
-
-		} catch (Exception e) {
-			try {
-				throw new CqiClientException(TXMCoreMessages.Partition_9 + partitionName + "_" + partName + e + " last error: " + CQPSearchEngine.getCqiClient().getLastCQPError()); //$NON-NLS-1$ //$NON-NLS-2$
-			} catch (Exception e1) {
-				Log.severe(TXMCoreMessages.Partition_18 + e1);
-				org.txm.utils.logger.Log.printStackTrace(e1);
-				return null;
-			}
-		}
-		long end = System.currentTimeMillis();
-		Log.finest(NLS.bind(TXMCoreMessages.info_partCreatedInXMs, partitionName + "_" + partName, (end - start))); //$NON-NLS-1
-
-		return part;
-	}
+//	/**
+//	 * TODO Part should be create lazily
+//	 * 
+//	 * Create a part with a raw query.
+//	 *
+//	 * @param partitionName the partition name
+//	 * @param partName the part name
+//	 * @param query the query
+//	 * @return the part
+//	 * @throws CqiClientException the cqi client exception
+//	 * 
+//	 * @author Sylvain Loiseau, mdecorde
+//	 */
+//	public Part createPart(String partitionName, String partName, String query) throws CqiClientException {
+//		Part part;
+//		String partCqpId = CqpObject.partNamePrefix + CQPCorpus.getNextSubcorpusCounter();
+//		Log.finest(NLS.bind(TXMCoreMessages.CREATING_PART, partName, query));
+//		long start = System.currentTimeMillis();
+//		try {
+//			CorpusManager.getCorpusManager().getCqiClient().cqpQuery(this.getParent().getQualifiedCqpId(), partCqpId, query);
+//			part = new Part(this);
+//			part.setParameters(partCqpId, partName, new CQLQuery(query));
+//			part.compute();
+//			// FIXME: persistence tests: define the UUID as the concatenation of all part CQP id
+////			this.uniqueID += partCqpId;
+//
+//		} catch (Exception e) {
+//			try {
+//				throw new CqiClientException(TXMCoreMessages.Partition_9 + partitionName + "_" + partName + e + " last error: " + CQPSearchEngine.getCqiClient().getLastCQPError()); //$NON-NLS-1$ //$NON-NLS-2$
+//			} catch (Exception e1) {
+//				Log.severe(TXMCoreMessages.Partition_18 + e1);
+//				org.txm.utils.logger.Log.printStackTrace(e1);
+//				return null;
+//			}
+//		}
+//		long end = System.currentTimeMillis();
+//		Log.finest(NLS.bind(TXMCoreMessages.info_partCreatedInXMs, partitionName + "_" + partName, (end - start))); //$NON-NLS-1
+//
+//		return part;
+//	}
 	
-	/**
-	 * Gets the dirty states.
-	 * 
-	 * @return
-	 */
-	public boolean isDirty() {
-		return this.dirty;
-	}
 
 	@Override
 	public String getDetails() {
 		return getName();
 	}
 
-	@Override
-	public String getName() {
-		return this.pName;
-	}
-
 	/**
 	 * Gets the number of parts.
 	 * 
 	 * @return the the number of parts.
 	 */
-	public int getNPart() {
+	public int getPartsCount() {
 		// FIXME: later should just return the direct children count
 		try {
 			if (!hasBeenComputedOnce()) {
@@ -480,7 +454,7 @@
 
 	@Override
 	public String getSimpleName() {
-		return this.pName;
+		return this.userName;
 	}
 
 	/**
@@ -531,7 +505,7 @@
 	 *             the cqi client exception
 	 */
 	public List<QueryResult> query(CQLQuery query, String name) throws CqiClientException {
-		Log.finest(TXMCoreMessages.QUERYING_PARTITION + this.pName);
+		Log.finest(TXMCoreMessages.QUERYING_PARTITION + this.userName);
 		List<Part> parts = getParts();
 		List<QueryResult> results = new ArrayList<QueryResult>(parts.size());
 		for (Subcorpus part : parts) {
@@ -605,21 +579,11 @@
 		//p.dropSubcorpus(p.getSubCorpus());
 	}
 
-	/**
-	 * Sets the name.
-	 *
-	 * @param name the new name
-	 */
-	public void setName(String name) {
-		this.pName = name;
-//		if(this.getSelfElement() != null)
-//			this.getSelfElement().setAttribute("name", name); //$NON-NLS-1$
-	}
 
-
+	@Override
 	public String toString() {
-		if (pName != null) {
-			return pName;
+		if (this.userName != null) {
+			return this.userName;
 		}
 		return super.toString();
 	}
@@ -634,7 +598,7 @@
 	public boolean setParameters(String name, StructuralUnitProperty property, List<String> values) {
 		this.pProperty = property;
 		this.pValues = values;
-		this.pName = name;
+		this.userName = name;
 		this.pQueries = null;
 		this.pPartNames = null;
 		return true;
@@ -643,7 +607,7 @@
 	public boolean setParameters(String name, List<String> queries, List<String> names) {
 		this.pProperty = null;
 		this.pValues = null;
-		this.pName = name;
+		this.userName = name;
 		this.pQueries = queries;
 		this.pPartNames = names;
 		return true;
@@ -651,7 +615,7 @@
 
 	@Override
 	public boolean setParameters(TXMParameters parameters) {
-		this.pName = parameters.getString(TXMPreferences.LAZY_NAME);
+		this.userName = parameters.getString(TXMPreferences.USER_NAME);
 		String tmp = parameters.getString(CQPPreferences.PART_NAMES);
 		if (tmp != null) {
 			this.pPartNames = Arrays.asList(tmp.split("\t"));
@@ -723,7 +687,7 @@
 	public boolean saveParameters() {
 
 		if (this.pProperty != null)	{
-			this.saveParameter(TBXPreferences.STRUCTURAL_UNIT_PROPERTY, this.pProperty.getName());
+			this.saveParameter(TXMPreferences.STRUCTURAL_UNIT_PROPERTY, this.pProperty.getName());
 		}
 		
 		if (this.pPartNames != null)	{
@@ -731,7 +695,7 @@
 		}
 		
 		if (this.pQueries != null)	{
-			this.saveParameter(TBXPreferences.QUERIES, StringUtils.join(pQueries, "\t"));
+			this.saveParameter(TXMPreferences.QUERIES, StringUtils.join(pQueries, "\t"));
 		}
 		
 		if (this.pValues != null)	{
@@ -761,7 +725,18 @@
 	public String getResultype() {
 		return "Partition";
 	}
+	
+	/**
+	 * Gets the parent Partition of the specified result if exists.
+	 * @param result
+	 * @return the parent Partition if exists otherwise null
+	 */
 	synchronized public static Partition getFirstParentPartition(TXMResult result) {
 		return (Partition) result.getFirstParent(Partition.class);
 	}
+
+	@Override
+	public String getName() {
+		return this.userName;
+	}
 }
Index: tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/query/PartitionFocus.java
===================================================================
--- tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/query/PartitionFocus.java	(revision 1137)
+++ tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/query/PartitionFocus.java	(revision 1138)
@@ -105,7 +105,7 @@
 	 */
 	public List<Part> getFocusedParts() {
 		List<Part> focused = new ArrayList<Part>(modality.size());
-		for (int i = 0; i < partition.getNPart(); i++) {
+		for (int i = 0; i < partition.getPartsCount(); i++) {
 			if (modality.contains(partition.getParts().get(i))) {
 				focused.add(partition.getParts().get(i));
 			}
@@ -120,7 +120,7 @@
 	 */
 	public List<Part> getNotFocusedParts() {
 		List<Part> notFocused = new ArrayList<Part>(modality.size());
-		for (int i = 0; i < partition.getNPart(); i++) {
+		for (int i = 0; i < partition.getPartsCount(); i++) {
 			if (!modality.contains(partition.getParts().get(i))) {
 				notFocused.add(partition.getParts().get(i));
 			}
Index: tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Subcorpus.java
===================================================================
--- tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Subcorpus.java	(revision 1137)
+++ tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Subcorpus.java	(revision 1138)
@@ -35,6 +35,7 @@
 import org.eclipse.osgi.util.NLS;
 import org.txm.core.messages.TXMCoreMessages;
 import org.txm.core.preferences.TBXPreferences;
+import org.txm.core.preferences.TXMPreferences;
 import org.txm.core.results.Parameter;
 import org.txm.core.results.TXMParameters;
 import org.txm.searchengine.cqp.AbstractCqiClient;
@@ -57,15 +58,18 @@
  */
 public class Subcorpus extends CQPCorpus {
 
+
+	private SelectionResult selectionResult;
+	protected QueryResult qresult;
+
+
+	
 	/**
 	 * Query used to build the corpus.
 	 */
-	@Parameter(key=TBXPreferences.QUERY)
+	@Parameter(key=TXMPreferences.QUERY)
 	protected CQLQuery pQuery;
 
-	private SelectionResult selectionResult;
-	protected QueryResult qresult;
-
 	
 	/**
 	 * 
@@ -122,18 +126,20 @@
 	 * {@link CQPCorpus#createSubcorpus(CQLQuery, String)}
 	 */
 	protected boolean _compute() throws Exception {
-		if (pQuery != null) {
+		if (this.pQuery != null) {
 			this.qresult = null; // reset
 			
-			CorpusManager.getCorpusManager().getCqiClient().cqpQuery(
-					this.getCorpusParent().getQualifiedCqpId(), pID,
-					pQuery.getQueryString());
+			CorpusManager.getCorpusManager().getCqiClient().cqpQuery(this.getCorpusParent().getQualifiedCqpId(), this.pID, this.pQuery.getQueryString());
 			
-			this.qresult = new QueryResult(pID, pName, this.getCorpusParent(), pQuery); // getCorpusParent().query(pQuery, this.pID, true);
+			this.qresult = new QueryResult(this.pID, this.pName, this.getCorpusParent(), this.pQuery); // getCorpusParent().query(pQuery, this.pID, true);
 		}
 		return qresult != null;
 	}
 
+	/**
+	 * Sets the query to use.
+	 * @param query
+	 */
 	public void setQuery(CQLQuery query) {
 		this.pQuery = query;
 	}
@@ -525,8 +531,8 @@
 
 	@Override
 	public boolean loadParameters() throws Exception {
-		String q = this.getStringParameterValue(TBXPreferences.QUERY);
-		if (q != null) {
+		String q = this.getStringParameterValue(TXMPreferences.QUERY);
+		if (!q.isEmpty()) {
 			pQuery = new CQLQuery(q);
 		}
 		
Index: tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Part.java
===================================================================
--- tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Part.java	(revision 1137)
+++ tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Part.java	(revision 1138)
@@ -29,7 +29,12 @@
 
 import java.io.File;
 
+import org.eclipse.osgi.util.NLS;
+import org.txm.core.messages.TXMCoreMessages;
+import org.txm.searchengine.cqp.CQPSearchEngine;
 import org.txm.searchengine.cqp.clientExceptions.CqiClientException;
+import org.txm.searchengine.cqp.corpus.query.CQLQuery;
+import org.txm.utils.logger.Log;
 
 /**
  * A Part is related to the {@link Partition} and is a CQP this.
@@ -45,9 +50,13 @@
 	 * 
 	 * @param partition
 	 */
-	public Part(Partition partition) {
+	public Part(Partition partition, String partName, String query) {
 		super(partition);
 
+		this.userName = partName;
+		this.pQuery = new CQLQuery(query);
+		this.pID = CqpObject.partNamePrefix + CQPCorpus.getNextSubcorpusCounter();
+		
 		this.setVisible(false);
 		this.internalPersistable = true;
 		this.userPersistable = false;
@@ -65,17 +74,72 @@
 		this.userPersistable = false;
 	}
 	
-	public Partition getParent() {
-		return (Partition)super.getParent();
+	@Override
+	public boolean loadParameters() throws Exception {
+		return super.loadParameters();
 	}
+	
+	@Override
+	protected boolean _compute() throws Exception {
 
+		Log.finest(NLS.bind(TXMCoreMessages.CREATING_PART, this.getName(), this.pQuery));
+		long start = System.currentTimeMillis();
+		try {
+			super._compute();
+
+		} catch (Exception e) {
+			try {
+				throw new CqiClientException(TXMCoreMessages.Partition_9 + this.getParent().getName() + "_" + this.getName() + e + " last error: " + CQPSearchEngine.getCqiClient().getLastCQPError()); //$NON-NLS-1$ //$NON-NLS-2$
+			} catch (Exception e1) {
+				Log.severe(TXMCoreMessages.Partition_18 + e1);
+				org.txm.utils.logger.Log.printStackTrace(e1);
+				return false;
+			}
+		}
+		long end = System.currentTimeMillis();
+		Log.finest(NLS.bind(TXMCoreMessages.info_partCreatedInXMs, this.getParent().getName() + "_" + this.getName(), (end - start))); //$NON-NLS-1
+
+		return true;
+	}
+	
+	
+//	public Part createPart(String partitionName, String partName, String query) throws CqiClientException {
+//		Part part;
+//		String partCqpId = CqpObject.partNamePrefix + CQPCorpus.getNextSubcorpusCounter();
+//		Log.finest(NLS.bind(TXMCoreMessages.CREATING_PART, partName, query));
+//		long start = System.currentTimeMillis();
+//		try {
+//			CorpusManager.getCorpusManager().getCqiClient().cqpQuery(this.getParent().getQualifiedCqpId(), partCqpId, query);
+//			part = new Part(this);
+//			part.setParameters(partCqpId, partName, new CQLQuery(query));
+//			part.compute();
+//			// FIXME: persistence tests: define the UUID as the concatenation of all part CQP id
+////			this.uniqueID += partCqpId;
+//
+//		} catch (Exception e) {
+//			try {
+//				throw new CqiClientException(TXMCoreMessages.Partition_9 + partitionName + "_" + partName + e + " last error: " + CQPSearchEngine.getCqiClient().getLastCQPError()); //$NON-NLS-1$ //$NON-NLS-2$
+//			} catch (Exception e1) {
+//				Log.severe(TXMCoreMessages.Partition_18 + e1);
+//				org.txm.utils.logger.Log.printStackTrace(e1);
+//				return null;
+//			}
+//		}
+//		long end = System.currentTimeMillis();
+//		Log.finest(NLS.bind(TXMCoreMessages.info_partCreatedInXMs, partitionName + "_" + partName, (end - start))); //$NON-NLS-1
+//
+//		return part;
+//	}
+//	
+	
+	
+	
 	/**
 	 * Gets the number of texts in this part.
 	 * 
 	 * @return the n texts
 	 * 
-	 * @throws CqiClientException
-	 *             the cqi client exception
+	 * @throws CqiClientException the cqi client exception
 	 */
 	public int getNTexts() throws CqiClientException {
 		if (nTexts < 0) {
Index: tmp/org.txm.specificities.core/src/org/txm/specificities/core/functions/Specificities.java
===================================================================
--- tmp/org.txm.specificities.core/src/org/txm/specificities/core/functions/Specificities.java	(revision 1137)
+++ tmp/org.txm.specificities.core/src/org/txm/specificities/core/functions/Specificities.java	(revision 1138)
@@ -34,6 +34,7 @@
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -185,12 +186,21 @@
 
 	@Override
 	protected boolean _compute() throws Exception {
+
+		this.frequencies = null;
+
 		
 		// recompute the lexical table
-		if(this.hasParameterChanged(TBXPreferences.UNIT_PROPERTY))	{
-			this.lexicalTable.setUnitProperty(this.unitProperty);
-			this.lexicalTable.compute(this, false);
+//		if(this.hasParameterChanged(TBXPreferences.UNIT_PROPERTY))	{
+//			this.lexicalTable.setUnitProperty(this.unitProperty);
+//			this.lexicalTable.compute(this, false);
+//		}
+		
+		// delete the specificities selection chart children since they can not be valid anymore
+		if(this.needsFullRecomputing || this.hasParameterChanged(TBXPreferences.UNIT_PROPERTY))	{
+			this.deleteChildren(SpecificitiesSelection.class);
 		}
+		
 
 		// essentially for cascade computing from the parent lexical table
 		this.unitProperty = this.lexicalTable.getProperty();
@@ -206,6 +216,7 @@
 				init(rSpecificities.getSymbol(), specIndex, "TLNONAME: " + this.unitProperty.getName()); //$NON-NLS-1$
 			}
 		}
+		
 		return true;
 	}
 	
@@ -452,7 +463,8 @@
 				//System.out.println("FROM TABLE");
 				frequencies = RWorkspace.getRWorkspaceInstance().evalToInt2D(lexicalTable.getData().getSymbol());
 				
-			} else {// if table == null : subcorpus specif 
+			}
+			else {// if table == null : subcorpus specif 
 				//System.out.println("FROM LEXICON");
 				frequencies = new int[lexicon.getFreq().length][2]; // build a frequency table from lexicons
 				String[] corpusforms = lexicon.getForms(); // all the forms
@@ -462,8 +474,8 @@
 
 				//				System.out.println("len subforms: "+subcorpusforms.length);
 				//				System.out.println("len subfreqs: "+subcorpusfreq.length);
-				for (int i = 0 ; i < corpusforms.length ; i++) //get all forms
-				{
+				 //get all forms
+				for (int i = 0 ; i < corpusforms.length ; i++) {
 					int j = 0; // find the index of the form in the subcorpus arrays
 					for (j = 0; j < subcorpusforms.length; j++) {
 						if (subcorpusforms[j].equals(corpusforms[i]))
Index: tmp/org.txm.specificities.rcp/src/org/txm/specificities/rcp/editors/SpecificitiesEditor.java
===================================================================
--- tmp/org.txm.specificities.rcp/src/org/txm/specificities/rcp/editors/SpecificitiesEditor.java	(revision 1137)
+++ tmp/org.txm.specificities.rcp/src/org/txm/specificities/rcp/editors/SpecificitiesEditor.java	(revision 1138)
@@ -148,7 +148,7 @@
 			
 			
 			// create 2nd column: Frequency
-			this.typeFrequencyColumn = new TableColumn(viewer.getTable(), SWT.NONE);
+			this.typeFrequencyColumn = new TableColumn(specificitesTable, SWT.NONE);
 			this.typeFrequencyColumn.setAlignment(SWT.RIGHT);
 			this.typeFrequencyColumn.setText(TXMCoreMessages.common_frequency);
 			
@@ -203,8 +203,14 @@
 					return;
 				}
 
+				// remove part columns if exist
+//				for (int firstPartColumnIndex = 3; firstPartColumnIndex < specificitesTable.getColumnCount(); firstPartColumnIndex++) {
+//					specificitesTable.getColumn(firstPartColumnIndex).dispose();
+//				}
+				
 				// System.out.println("partnames: "+Arrays.toString(partNames));
-				for (int i = 0, columnIndex = 2; i < partNames.length ; i++) { // for each part
+				 // for each part
+				for (int i = 0, firstPartColumnIndex = 2; i < partNames.length ; i++) {
 
 					//FREQ COLUMN
 					final TableColumn freqpartTableColumn = new TableColumn(specificitesTable, SWT.NONE);
@@ -214,7 +220,7 @@
 					freqpartTableColumn.setAlignment(SWT.RIGHT);
 					freqpartTableColumn.pack();
 					
-					viewerComparator.addSelectionAdapter(viewer, freqpartTableColumn, ++columnIndex);
+					viewerComparator.addSelectionAdapter(viewer, freqpartTableColumn, ++firstPartColumnIndex);
 
 					//SCORE COLUMN
 					final TableColumn partTableColumn = new TableColumn(specificitesTable, SWT.NONE);
@@ -224,7 +230,7 @@
 					partTableColumn.setAlignment(SWT.RIGHT);
 					partTableColumn.pack();
 
-					viewerComparator.addSelectionAdapter(viewer, partTableColumn, ++columnIndex);
+					viewerComparator.addSelectionAdapter(viewer, partTableColumn, ++firstPartColumnIndex);
 					
 				}
 			}
@@ -248,10 +254,10 @@
 				//final int[] sortedPartIndexes = specificitesResult.getSortedPartIndexes();
 	
 				// Create an array of lines to fill the tables
-				//		System.out.println("len types: "+typeNames.length);
-				//		System.out.println("len freq: "+typeFreq.length);
-				//		System.out.println("len spec: "+specFreqs.length);
-				//		System.out.println("len specidx: "+specIndex.length);
+						System.out.println("len types: "+typeNames.length);
+						System.out.println("len freq: "+typeFreq.length);
+						System.out.println("len specfreqs: "+specFreqs.length);
+						System.out.println("len specidx: "+specIndex.length);
 				 Object[] tableLines = new Object[typeNames.length];
 				for (int j = 0; j < tableLines.length; j++) {
 					tableLines[j] = new Object[] { typeNames[j], new Integer(typeFreq[j]), specFreqs[j], specIndex[j] };
Index: tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCCAChartCreator.java
===================================================================
--- tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCCAChartCreator.java	(revision 1137)
+++ tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCCAChartCreator.java	(revision 1138)
@@ -79,11 +79,24 @@
 	public void updateChart(ChartResult result) {
 
 		CA ca = (CA) result;
+		
 		JFreeChart chart = (JFreeChart)result.getChart();
-		
+
 		// freeze rendering while computing
 		chart.setNotify(false);
+
 		
+		// recreate the dataset if the unit property has changed
+//		if(ca.getLexicalTable().hasParameterChanged(TXMPreferences.UNIT_PROPERTY))	{
+//			try {
+//				chart.getXYPlot().setDataset(new CAXYDataset(ca));
+//			}
+//			catch (Exception e) {
+//				// TODO Auto-generated catch block
+//				e.printStackTrace();
+//			} 
+//		}
+
 		
 		CAItemSelectionRenderer renderer = (CAItemSelectionRenderer) chart.getXYPlot().getRenderer(); 
    	 //	XYPlot plot = chart.getXYPlot();
Index: tmp/org.txm.rcp/src/main/java/org/txm/rcp/actions/CreatePartitionDialog.java
===================================================================
--- tmp/org.txm.rcp/src/main/java/org/txm/rcp/actions/CreatePartitionDialog.java	(revision 1137)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/actions/CreatePartitionDialog.java	(revision 1138)
@@ -632,7 +632,7 @@
 			return null;
 		}
 		
-		if (p.getNPart() == 0) {
+		if (p.getPartsCount() == 0) {
 			Log.severe(TXMUIMessages.CreatePartitionDialog_10);
 			return null;
 		}		
Index: tmp/org.txm.rcp/src/main/java/org/txm/rcp/adapters/TXMResultAdapter.java
===================================================================
--- tmp/org.txm.rcp/src/main/java/org/txm/rcp/adapters/TXMResultAdapter.java	(revision 1137)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/adapters/TXMResultAdapter.java	(revision 1138)
@@ -67,6 +67,13 @@
 	    	Color color = display.getSystemColor(SWT.COLOR_DARK_GRAY);
 	    	return color.getRGB();
 		}
+		// FIXME: DEbug
+//		else if(element instanceof TXMResult && ((TXMResult)element).isDirty())	{
+//	    	Display display = Display.getCurrent();
+//	    	Color color = display.getSystemColor(SWT.COLOR_YELLOW);
+//	    	return color.getRGB();
+//		}
+
 		return null;
     }
 
Index: tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TXMEditor.java
===================================================================
--- tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TXMEditor.java	(revision 1137)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TXMEditor.java	(revision 1138)
@@ -44,6 +44,7 @@
 import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.IPartListener;
 import org.eclipse.ui.IPartListener2;
@@ -626,10 +627,10 @@
 						public void run() {
 							if(update)	{
 								// FIXME: DEbug
-								System.err.println("TXMEditor.compute(): manually updating result from editor."); //$NON-NLS-1$
+								Log.finest("TXMEditor.compute(): " + TXMEditor.this.getClass().getSimpleName() + ": manually updating result from editor."); //$NON-NLS-1$
 								updateResultFromEditor(); // subclasses manual result updating from editor fields
 								// FIXME: DEbug
-								System.err.println("TXMEditor.compute(): auto updating result from editor."); //$NON-NLS-1$
+								Log.finest("TXMEditor.compute(): " + TXMEditor.this.getClass().getSimpleName() + ": auto updating result from editor."); //$NON-NLS-1$
 								autoUpdateResultFromEditorParameters(); // auto updating result from Parameter annotations in result <=> editor
 
 								// Stores the last parameters before the computing to later auto-update the Widgets only if some parameters have changed 
@@ -773,26 +774,29 @@
 			CorporaView.refreshObject(this);
 			TXMResultDebugView.refreshView();
 
+			// FIXME: debug test to not draw while updating the widgets
+			this.getContainer().setRedraw(true);
+
+			
 			// FIXME: update all open editors of the children result
 			// FIXME: prob here is that updateEditorFromResult() doesn't enough because the compute() method does some other stuff
 			// so the cascade computing may be done here rather than in TXMResult.compute() or we need to move some stuff from TXMEditor.compute() to
 			// TXMEditor.updateEditorFromResult(), eg. the chart loading
 			// WARNING: At This moment, with this code, TXMResult.compute() of the children is called twice
-			//			for (IEditorReference reference : PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences()) {
-			//				IEditorPart editor = reference.getEditor(false);
-			//				if(editor != null && editor instanceof TXMEditor)	{
-			//					TXMEditor txmEditor = ((TXMEditor)editor);
-			//					if(txmEditor.getResult().getParent() == this.getResult())	{
-			//						Log.finest("TXMEditor.refresh(): updating editor for result: " + txmEditor.getResult().getSimpleName());
-			//						txmEditor.compute(true);
-			//						//txmEditor.updateEditorFromResult(false);
-			//					}
-			//				}
-			//			}
+//						for (IEditorReference reference : PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences()) {
+//							IEditorPart editor = reference.getEditor(false);
+//							if(editor != null && editor instanceof TXMEditor)	{
+//								TXMEditor txmEditor = ((TXMEditor)editor);
+//								if(txmEditor.getResult().getParent() == this.getResult())	{
+//									Log.finest("TXMEditor.refresh(): updating editor for result: " + txmEditor.getResult().getSimpleName());
+//									txmEditor.compute(false);
+//									//txmEditor.updateEditorFromResult(false);
+//									//txmEditor.refresh(false);
+//								}
+//							}
+//						}
 
 			
-			// FIXME: debug test to not draw while updating the widgets
-			this.getContainer().setRedraw(true);
 
 
 		}
Index: tmp/org.txm.partition.rcp/plugin.xml
===================================================================
--- tmp/org.txm.partition.rcp/plugin.xml	(revision 1137)
+++ tmp/org.txm.partition.rcp/plugin.xml	(revision 1138)
@@ -69,11 +69,9 @@
                style="push">
             <visibleWhen
                   checkEnabled="false">
-               <or>
-                  <reference
-                        definitionId="OneChartResultSelected">
-                  </reference>
-               </or>
+               <test
+                     property="org.txm.partition.rcp.test1">
+               </test>
             </visibleWhen>
          </command>
       </menuContribution>
Index: tmp/org.txm.ca.rcp/src/org/txm/ca/rcp/handlers/ComputeCA.java
===================================================================
--- tmp/org.txm.ca.rcp/src/org/txm/ca/rcp/handlers/ComputeCA.java	(revision 1137)
+++ tmp/org.txm.ca.rcp/src/org/txm/ca/rcp/handlers/ComputeCA.java	(revision 1138)
@@ -81,9 +81,9 @@
 
 				Partition partition = (Partition) selection;
 
-				if (partition.getNPart() < 4) { // error to few parts
+				if (partition.getPartsCount() < 4) { // error to few parts
 					MessageDialog d = new MessageDialog(window.getShell(), "", null, //$NON-NLS-1$
-							NLS.bind(CAUIMessages.ComputeCorrespondanceAnalysis_4, partition.getNPart()), 0, new String[] { ""}, 0); //$NON-NLS-1$
+							NLS.bind(CAUIMessages.ComputeCorrespondanceAnalysis_4, partition.getPartsCount()), 0, new String[] { ""}, 0); //$NON-NLS-1$
 					d.open();
 					return null;
 				}
Index: tmp/org.txm.lexicaltable.core/src/org/txm/lexicaltable/core/functions/LexicalTable.java
===================================================================
--- tmp/org.txm.lexicaltable.core/src/org/txm/lexicaltable/core/functions/LexicalTable.java	(revision 1137)
+++ tmp/org.txm.lexicaltable.core/src/org/txm/lexicaltable/core/functions/LexicalTable.java	(revision 1138)
@@ -200,7 +200,7 @@
 
 		// parts lexicons
 		List<Lexicon> partsLexicons = new ArrayList<Lexicon>();
-		for (int i = 0; i < partition.getNPart(); i++) {
+		for (int i = 0; i < partition.getPartsCount(); i++) {
 			partsLexicons.add(Lexicon.getLexicon(partition.getParts().get(i), this.property, this.monitor, false));
 		}
 
Index: tmp/org.txm.ahc.rcp/src/org/txm/ahc/rcp/handlers/ComputeAHC.java
===================================================================
--- tmp/org.txm.ahc.rcp/src/org/txm/ahc/rcp/handlers/ComputeAHC.java	(revision 1137)
+++ tmp/org.txm.ahc.rcp/src/org/txm/ahc/rcp/handlers/ComputeAHC.java	(revision 1138)
@@ -90,9 +90,9 @@
 		else if (selection instanceof Partition) {
 			//System.out.println("Compute CAH with Partition : "+((Partition)selection.getFirstElement()).getName());
 			Partition partition = (Partition)selection;
-			if (partition.getNPart() < 4) {
+			if (partition.getPartsCount() < 4) {
 				MessageDialog d = new MessageDialog(window.getShell(), TXMCoreMessages.error_error2, null,
-						NLS.bind(AHCUIMessages.error_canNotComputeAHCWith, partition.getNPart()), 0, new String[] { TXMCoreMessages.common_ok}, 0);
+						NLS.bind(AHCUIMessages.error_canNotComputeAHCWith, partition.getPartsCount()), 0, new String[] { TXMCoreMessages.common_ok}, 0);
 				d.open();
 				return null;
 			}
Index: tmp/org.txm.queryindex.rcp/src/org/txm/functions/queryindex/QueryIndex.java
===================================================================
--- tmp/org.txm.queryindex.rcp/src/org/txm/functions/queryindex/QueryIndex.java	(revision 1137)
+++ tmp/org.txm.queryindex.rcp/src/org/txm/functions/queryindex/QueryIndex.java	(revision 1138)
@@ -279,7 +279,7 @@
 		if (lines.containsKey(name)) return null;
 		QueryResult[] qresults;
 		if (partition != null) {
-			qresults = new QueryResult[partition.getNPart()];
+			qresults = new QueryResult[partition.getPartsCount()];
 			List<Part> parts = partition.getParts();
 			for (int i = 0 ; i < parts.size() ; i++) {
 				qresults[i] = parts.get(i).query(query, "tmp", true); //$NON-NLS-1$
@@ -299,7 +299,7 @@
 	public LexicalTable toLexicalTable() {
 		if (partition == null) return null;
 
-		int npart = partition.getNPart();
+		int npart = partition.getPartsCount();
 		int[][] freqs = new int[lines.size()][npart];
 		String[] rownames = new String[lines.size()];
 		String[] colnames = new String[npart];
Index: tmp/org.txm.queryindex.rcp/src/org/txm/queryindex/core/functions/QueryIndex.java
===================================================================
--- tmp/org.txm.queryindex.rcp/src/org/txm/queryindex/core/functions/QueryIndex.java	(revision 1137)
+++ tmp/org.txm.queryindex.rcp/src/org/txm/queryindex/core/functions/QueryIndex.java	(revision 1138)
@@ -279,7 +279,7 @@
 		if (lines.containsKey(name)) return null;
 		QueryResult[] qresults;
 		if (partition != null) {
-			qresults = new QueryResult[partition.getNPart()];
+			qresults = new QueryResult[partition.getPartsCount()];
 			List<Part> parts = partition.getParts();
 			for (int i = 0 ; i < parts.size() ; i++) {
 				qresults[i] = parts.get(i).query(query, "tmp", true); //$NON-NLS-1$
@@ -299,7 +299,7 @@
 	public LexicalTable toLexicalTable() {
 		if (partition == null) return null;
 
-		int npart = partition.getNPart();
+		int npart = partition.getPartsCount();
 		int[][] freqs = new int[lines.size()][npart];
 		String[] rownames = new String[lines.size()];
 		String[] colnames = new String[npart];
Index: tmp/org.txm.index.core/src/org/txm/index/core/functions/Lexicon.java
===================================================================
--- tmp/org.txm.index.core/src/org/txm/index/core/functions/Lexicon.java	(revision 1137)
+++ tmp/org.txm.index.core/src/org/txm/index/core/functions/Lexicon.java	(revision 1138)
@@ -135,7 +135,6 @@
 	@Override
 	public boolean loadParameters() throws Exception {
 		try {
-			//this.persistable = false; // FIXME: remove that later
 			String p = this.getStringParameterValue(TXMPreferences.UNIT_PROPERTY);
 			if (p != null && p.length() > 0) {
 				CQPCorpus parent = getParent();
Index: tmp/org.txm.core/src/java/org/txm/core/results/TXMResult.java
===================================================================
--- tmp/org.txm.core/src/java/org/txm/core/results/TXMResult.java	(revision 1137)
+++ tmp/org.txm.core/src/java/org/txm/core/results/TXMResult.java	(revision 1138)
@@ -76,6 +76,11 @@
 	protected boolean hasBeenComputedOnce = false;
 
 	/**
+	 * Can be used to know if an object needs a full recomputing.
+	 */
+	protected boolean needsFullRecomputing = false;
+	
+	/**
 	 * The weight, essentially used for sorting purpose.
 	 */
 	protected int weight;
@@ -139,6 +144,11 @@
 	 */
 	protected HashMap<String, Object> lastParameters = new HashMap<String, Object>();
 
+	// FIXME: SJ: actually only used by the chart results. Purpose here is that the chart creators need to know if a computing parameter has changed to recreate or not some entity.
+	// The problem is since the result is already computing, the parameters are already updated and the method hasParameterChanged() will always return false. Using this stack fix the problem.
+	// But this stack is also the start for an UNDO command on TXMResult.
+	protected ArrayList<HashMap<String, Object>> parametersHistory = new ArrayList<HashMap<String, Object>>();
+	
 
 	/**
 	 * Internal persistable state.
@@ -282,6 +292,14 @@
 		if (this.parent == null)	{
 			Log.warning("Warning: the TXMResult of " + this.getClass() + " is attached to no parent. (uuid = " + this.getUUID() + ")");
 		}
+		
+		try {
+			this.updateLastParameters();
+		}
+		catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 	}
 
 	public void setUserName(String name) {
@@ -399,6 +417,9 @@
 	 */
 	protected void updateLastParameters(int parameterType) throws Exception {
 
+		// FIXME: SJ store in the history stack
+		HashMap<String, Object> lastParametersHistory = new HashMap<>();
+		
 		List<Field> fields = this.getAllFields();
 
 		for (Field f : fields) {
@@ -417,7 +438,11 @@
 
 			f.setAccessible(true);
 			this.lastParameters.put(name, f.get(this));
+			
+			lastParametersHistory.put(name, f.get(this));
 		}
+		
+		this.parametersHistory.add(lastParametersHistory);
 	}
 
 
@@ -764,7 +789,19 @@
 		return TXMPreferences.keyExists(this.parametersNodePath, key);
 	}
 	
+	/**
+	 * Checks if a preference is empty (equals to "") in the command preference node.
+	 * An empty preference can be used to disable a functionality for a kind of result
+	 * (eg. A partition dimension bar chart does not have a legend so it can be used to not offer the hide/show legend button in UI).
+	 * @param key
+	 * @return
+	 */
+	public boolean isEmptyPreference(String key)	{
+		return TXMPreferences.isEmpty(this.commandPreferencesNodePath, key);
+	}
 
+
+
 	/**
 	 * Stores the specified parameters pairs of key/value in a local node dedicated to the specified result. The node qualifier is generated by the <code>TXMResult.getUUID</code> method.
 	 * 
@@ -964,8 +1001,15 @@
 		return setParameters(new TXMParameters(parameters));
 	}
 
+	/**
+	 * Sets a parameters from its parameter annotation "key".
+	 * @param key
+	 * @param value
+	 * @return
+	 * @throws Exception
+	 */
 	public boolean setParameter(String key, Object value) throws Exception	{
-		return setParameter(key, value, false);
+		return setParameter(key, value, true);
 	}
 	
 	/**
@@ -998,14 +1042,16 @@
 			targetField.setAccessible(true);
 
 			// FIXME: debug
-			//			if(value != null)	{
-			//				Log.info("TXMResult.setParameter(): setting parameter " + key + " = " + value + " for " + this.getClass() + " (" + value.getClass() + ")");
-			//			}
+			//if(value != null)	{
+			//	Log.info("TXMResult.setParameter(): setting parameter " + key + " = " + value + " for " + this.getClass() + " (" + value.getClass() + ")");
+			//}
 
 			targetField.set(this, value);
-		} else if (bubble) {
-			getParent().setParameter(key, value);
 		}
+		//else
+		if (this.parent != null && bubble) {
+			this.parent.setParameter(key, value);
+		}
 
 		return true;
 	}
@@ -1233,6 +1279,18 @@
 		}
 	}
 
+	/**
+	 * Deletes the children of the specified class.
+	 * @param type
+	 * @return
+	 */
+	synchronized public void deleteChildren(Class type) {
+		ArrayList<TXMResult> children = (ArrayList<TXMResult>) this.getChildren(type);
+		for (int i = 0; i < children.size(); i++) {
+			children.get(i).delete();
+		}
+	}
+	
 
 	/**
 	 * Gets the first child.
@@ -1684,17 +1742,6 @@
 
 
 	/**
-	 * 
-	 * @param monitor
-	 * @param deepComputing
-	 * @return
-	 * @throws Exception
-	 */
-	public boolean compute(IProgressMonitor monitor, boolean deepComputing) throws Exception	{
-		return this.compute(monitor, deepComputing, true);
-	}
-
-	/**
 	 * Computes the result if 
 	 * it can be computed 
 	 * it is dirty 
@@ -1709,7 +1756,7 @@
 	 * @throws CqiClientExceptio
 	 * @throws IOException
 	 */
-	protected boolean compute(IProgressMonitor monitor, boolean deepComputing, boolean updateLastParameters) throws Exception {
+	public boolean compute(IProgressMonitor monitor, boolean deepComputing) throws Exception {
 
 		// FIXME: see if this skipComputing tests is still useful? is it possible to directly return instead?
 		// en fait voir ChartResult.compute() if(super.compute(monitor, true, false)), je pense que le prob vient du fait que si on retourne false dans TXMResult.compute() alors renderChart() ne sera pas appelé 
@@ -1717,7 +1764,7 @@
 
 		this.monitor = monitor;
 
-		if (!this.isDirtyFromHistory() && !this.isDirty()) {
+		if (!this.needsFullRecomputing && !this.isDirtyFromHistory() && !this.isDirty()) {
 			Log.finest("TXMResult.compute(): " + this.getClass().getSimpleName() + ": result parameters have not changed since last computing, computing skipped.");
 			skipComputing = true;
 		}
@@ -1733,7 +1780,7 @@
 			//		if (parent != null && !parent.getHasBeenComputedOnce()) { // parent must be computed at least one time
 			// SJ: other way, test the object itself
 			if (this.parent != null && !(this.parent instanceof Project)) {
-				if (!this.parent.compute(monitor, false, updateLastParameters)) {
+				if (!this.parent.compute(monitor, true)) {
 					Log.severe("TXMResult.compute(): " + this.getClass().getSimpleName() + ": failed to compute parent result.");
 
 					//return false;
@@ -1756,30 +1803,51 @@
 		// clear the lazy name, no more needed since the object has been computed and getSimpleName() can now work
 		this.lazyName = null;
 
-		// store last used parameters
-		if (updateLastParameters)	{
+//		// store last used parameters
+//		if (updateLastParameters)	{
+//			this.updateLastParameters();
+//		}
+//
+//		if (!this.autoSaveParametersFromAnnotations()) {
+//			Log.severe("TXMResult.compute(): " + this.getClass().getSimpleName() + ": failed to save parameters from annotations for " + this.getName() + ".");
+//		}
+//		if (!this.saveParameters()) {
+//			Log.severe("TXMResult.compute():" + this.getClass().getSimpleName() + ": failed to save parameters for " + this.getName() + ".");
+//		}
+//
+//		// file persistence flush
+//		// FIXME: to do only if !skipComputing?
+//		if (this.mustBePersisted()) {
+//			TXMPreferences.flush(this);
+//		}
+
+		if(!skipComputing)	{
+			
+			// store last used parameters
 			this.updateLastParameters();
-		}
 
-		if (!this.autoSaveParametersFromAnnotations()) {
-			Log.severe("TXMResult.compute(): " + this.getClass().getSimpleName() + ": failed to save parameters from annotations for " + this.getName() + ".");
-		}
-		if (!this.saveParameters()) {
-			Log.severe("TXMResult.compute():" + this.getClass().getSimpleName() + ": failed to save parameters for " + this.getName() + ".");
-		}
+			if (!this.autoSaveParametersFromAnnotations()) {
+				Log.severe("TXMResult.compute(): " + this.getClass().getSimpleName() + ": failed to save parameters from annotations for " + this.getName() + ".");
+			}
+			if (!this.saveParameters()) {
+				Log.severe("TXMResult.compute():" + this.getClass().getSimpleName() + ": failed to save parameters for " + this.getName() + ".");
+			}
 
-		// file persistence flush
-		if (this.mustBePersisted()) {
-			TXMPreferences.flush(this);
-		}
-
-		if(!skipComputing)	{
+			// file persistence flush
+			if (this.mustBePersisted()) {
+				TXMPreferences.flush(this);
+			}
+			
+			
 			this.dirty = false; // the computing was successful, the result is no more dirty
 			this.hasBeenComputedOnce = true; 
+			this.needsFullRecomputing = false;
+			
 			Log.finest("TXMResult.compute(): " + this.getClass().getSimpleName() + ": computing of result type " + this.getClass() + " done.");
 			
+			// set the children as dirty since the result has changed
 			for (int i = 0; i < this.children.size(); i++) {
-				this.getChild(i).setDirty(); // force recomputing even if some parameters of the result itself have not changed
+				this.getChild(i).setDirty();
 			}
 			
 			// Children cascade computing
@@ -1787,12 +1855,14 @@
 
 				Log.finest("TXMResult.compute(): " + this.getClass().getSimpleName() + ": cascade computing of " + this.children.size() + " children.");
 
-				for (TXMResult child : getChildren()) {
+				for (TXMResult child : this.getChildren()) {
 					// FIXME: may be better to add a member needFullRecomputing in TXMResult?
 //					this.getChild(i).setDirty(); // force recomputing even if some parameters of the result itself have not changed
-					//this.getChild(i).setHasBeenComputedOnce(false); // force recomputing even if some parameters of the result itself have not changed
+					child.setNeedsFullRecomputing(true); // force recomputing even if some parameters of the result itself have not changed
+					
+					// recompute only children that has been opened once
 					//if (child.hasBeenComputedOnce()) {
-						child.compute(monitor, deepComputing, updateLastParameters);
+						child.compute(monitor, deepComputing);
 					//}
 				}
 			}
@@ -2092,4 +2162,25 @@
 	public String getParametersNodePath() {
 		return parametersNodePath;
 	}
+
+	/**
+	 * @return the needsFullRecomputing
+	 */
+	public boolean needsFullRecomputing() {
+		return needsFullRecomputing;
+	}
+
+	/**
+	 * @param needsFullRecomputing the needsFullRecomputing to set
+	 */
+	public void setNeedsFullRecomputing(boolean needsFullRecomputing) {
+		this.needsFullRecomputing = needsFullRecomputing;
+	}
+
+	/**
+	 * @return the parametersHistory
+	 */
+	public ArrayList<HashMap<String, Object>> getParametersHistory() {
+		return parametersHistory;
+	}
 }
Index: tmp/org.txm.partition.core/src/org/txm/partition/core/functions/PartitionDimensions.java
===================================================================
--- tmp/org.txm.partition.core/src/org/txm/partition/core/functions/PartitionDimensions.java	(revision 1137)
+++ tmp/org.txm.partition.core/src/org/txm/partition/core/functions/PartitionDimensions.java	(revision 1138)
@@ -60,7 +60,6 @@
 	 */
 	public PartitionDimensions(Partition partition) {
 		super(partition);
-		System.err.println("PartitionDimensions.PartitionDimensions(): tesstttttttttttttttttttt");
 	}
 
 	/**
@@ -88,13 +87,10 @@
 	
 	@Override
 	protected boolean _compute() throws Exception {
-		// parts
+		// retrieve the parts
 		this.parts = this.getPartition().getParts();
-//		for (Part part : parts) { // no more needed since TXMResult.compute is deep computing
-//			part.compute();
-//		}
 		
-		// parts sorted by size 
+		// store a copy of parts sorted by size 
 		List<Part> sortedParts = new ArrayList<Part>(this.parts);
 		Collections.sort(sortedParts, new Comparator<Part>() {
 			@Override
@@ -121,8 +117,6 @@
 		return this.getPartition() != null;
 	}
 
-
-
 	@Override
 	public boolean setParameters(TXMParameters parameters) {
 		try {
Index: tmp/org.txm.progression.core/src/org/txm/progression/core/chartsengine/jfreechart/JFCProgressionCumulativeChartCreator.java
===================================================================
--- tmp/org.txm.progression.core/src/org/txm/progression/core/chartsengine/jfreechart/JFCProgressionCumulativeChartCreator.java	(revision 1137)
+++ tmp/org.txm.progression.core/src/org/txm/progression/core/chartsengine/jfreechart/JFCProgressionCumulativeChartCreator.java	(revision 1138)
@@ -19,6 +19,7 @@
 import org.txm.chartsengine.jfreechart.core.renderers.MultipleItemsSelector;
 import org.txm.chartsengine.jfreechart.core.renderers.interfaces.IRendererWithItemSelection;
 import org.txm.chartsengine.jfreechart.core.themes.base.ExtendedNumberAxis;
+import org.txm.core.preferences.TXMPreferences;
 import org.txm.progression.core.chartsengine.base.ProgressionChartCreator;
 import org.txm.progression.core.chartsengine.base.Utils;
 import org.txm.progression.core.chartsengine.jfreechart.themes.highcharts.renderers.ProgressionItemSelectionRenderer;
@@ -119,7 +120,7 @@
 		
 		
 		// Fill the data set from the result
-		if(progression.hasParameterChanged(ProgressionPreferences.QUERIES))	{
+		if(progression.hasParameterChanged(TXMPreferences.QUERIES))	{
 			XYSeriesCollection dataset = (XYSeriesCollection) chart.getXYPlot().getDataset();
 			dataset.removeAllSeries();
 			
