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 2144)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TXMEditor.java	(revision 2145)
@@ -1037,7 +1037,8 @@
 	 * @throws Exception 
 	 */
 	public final void refresh(boolean update) throws Exception {
-
+		if (this.parent.isDisposed()) return; // nothing to refresh
+		
 		// skip refresh if the part creation has failed
 		if (!createPartControlDoneSucessfully) {
 			return;
@@ -1077,7 +1078,7 @@
 			this.topToolBar.setComputingParametersVisible(false);
 		}
 
-		this.topToolBar.redraw();
+		if (!topToolBar.isDisposed()) this.topToolBar.redraw();
 
 		CorporaView.refreshObject(this);
 		TXMResultDebugView.refreshView();
Index: tmp/org.txm.progression.core/src/org/txm/progression/core/chartsengine/jfreechart/themes/highcharts/renderers/ProgressionItemSelectionRenderer.java
===================================================================
--- tmp/org.txm.progression.core/src/org/txm/progression/core/chartsengine/jfreechart/themes/highcharts/renderers/ProgressionItemSelectionRenderer.java	(revision 2144)
+++ tmp/org.txm.progression.core/src/org/txm/progression/core/chartsengine/jfreechart/themes/highcharts/renderers/ProgressionItemSelectionRenderer.java	(revision 2145)
@@ -254,6 +254,13 @@
 		return s;
 	}
 
+	public void setAdditionalShapeScales(List<List<Double>> shapeScales) {
+		this.additionalShapesScale = shapeScales;
+	}
+	
+	public void setAdditionalLabelInformation(List<List<String>> informations) {
+		this.additionalInformations = informations;
+	}
 
 	/**
 	 * @param chartPanel the chartPanel to set
@@ -307,6 +314,14 @@
 
 		label += "\n" + RendererUtils.valuesNumberFormat.format(((XYSeriesCollection) dataset).getSeries(series).getY(item)) + " / " + (((XYSeriesCollection) dataset).getSeries(series).getItemCount() - 2); //$NON-NLS-1$ //$NON-NLS-2$ // -2 for the 0 point and the dummy last point 
 		
+		if (additionalInformations != null) {
+			if (additionalInformations.size() > series) {
+				if (additionalInformations.get(series).size() > item) {
+					label += "\n "+additionalInformations.get(series).get(item);
+				}
+			}
+		}
+		
 		return label;
 	}
 	
Index: tmp/org.txm.analec.rcp/src/org/txm/macroprototypes/urs/exploit/SchemaAccessibilityScoresMacro.groovy
===================================================================
--- tmp/org.txm.analec.rcp/src/org/txm/macroprototypes/urs/exploit/SchemaAccessibilityScoresMacro.groovy	(revision 0)
+++ tmp/org.txm.analec.rcp/src/org/txm/macroprototypes/urs/exploit/SchemaAccessibilityScoresMacro.groovy	(revision 2145)
@@ -0,0 +1,148 @@
+// Copyright © 2016 ENS de Lyon, CNRS, University of Franche-Comté
+// Licensed under the terms of the GNU General Public License (http://www.gnu.org/licenses)
+// @author mdecorde
+// @author sheiden
+
+// STANDARD DECLARATIONS
+package org.txm.macroprototypes.urs.exploit
+
+import org.kohsuke.args4j.*
+import groovy.transform.Field
+import org.txm.rcp.swt.widget.parameters.*
+import org.txm.annotation.urs.*
+import org.txm.macro.urs.AnalecUtils
+import visuAnalec.elements.*
+import org.txm.searchengine.cqp.corpus.*
+import org.txm.Toolbox
+import org.txm.rcp.commands.*
+import org.txm.statsengine.r.core.RWorkspace
+
+def selection = []
+for (def s : corpusViewSelections) {
+	if (s instanceof CQPCorpus) selection << s
+	else if (s instanceof Partition) selection.addAll(s.getParts())
+}
+
+if (selection.size() == 0) {
+	println "** $scriptName: please select a Corpus or a Partition in the Corpus view: "+corpusViewSelections
+	return false
+} else {
+	for (def c : selection) c.compute(false)
+}
+
+@Field @Option(name="schema_ursql", usage="TYPE@PROP=REGEX", widget="String", required=true, def="CHAINE")
+		String schema_ursql
+
+@Field @Option(name="minimum_schema_size", usage="minimal schema size", widget="Integer", required=true, def="3")
+		int minimum_schema_size
+@Field @Option(name="maximum_schema_size", usage="Maximum size needed to consider a schema", widget="Integer", required=true, def="9999999")
+		int maximum_schema_size
+@Field @Option(name="schema_property_display", usage="schema property to show", widget="String", required=true, def="REF")
+		String schema_property_display
+@Field @Option(name="unit_ursql", usage="TYPE@PROP=REGEX", widget="String", required=false, def="MENTION")
+		String unit_ursql
+@Field @Option(name="strict_inclusion", usage="Units must be strictly included into corpus matches", widget="Boolean", required=true, def="true")
+		boolean strict_inclusion
+@Field @Option(name="position_in_matches", usage="Unit distance to structure limit (0 = no selection, 1 = first after limit, -1 = last before limit, etc.)", widget="Integer", required=true, def="0")
+		int position_in_matches
+@Field @Option(name="sep", usage="choose between the len or freq columns", widget="Separator", metaVar="freq	len", required=true, def="")
+		def sep
+@Field @Option(name="sort_column", usage="choose between the len or freq columns", widget="StringArray", metaVar="freq	len", required=true, def="freq")
+		String sort_column
+@Field @Option(name="max_lines", usage="cut the number of lines shown. '0' means no cut", widget="Integer", required=false, def="0")
+		int max_lines
+//@Field @Option(name="output_graph", usage="Show chart", widget="Boolean", required=true, def="false")
+		output_graph = false
+@Field @Option(name="debug", usage="Show internal variable content", widget="StringArray", metaVar="OFF	ON	ALL	REALLY ALL", required=true, def="OFF")
+		debug
+
+if (!ParametersDialog.open(this)) return;
+if (debug == "OFF") debug = 0; else if (debug == "ON") debug = 1; else if (debug == "ALL") debug = 2 else if (debug == "REALLY ALL") debug = 3
+
+for (def corpus : selection) {
+	def analecCorpus = URSCorpora.getCorpus(corpus)
+
+	def errors = AnalecUtils.isPropertyDefined(Schema.class, analecCorpus, schema_ursql)
+	if (errors.size() > 0) {
+		println "** The $schema_ursql schema URSQL cannot be computed in the corpus with types: $errors."
+		return;
+	}
+
+	errors=AnalecUtils.isPropertyDefined(Unite.class, analecCorpus, unit_ursql)
+	if (errors.size() > 0) {
+		println "** $unit_ursql unit URSQL cannot be computed in the corpus with types: $errors."
+		return;
+	}
+
+	def schemas = AnalecUtils.selectSchemasInCorpus(debug, analecCorpus, corpus, schema_ursql, minimum_schema_size, maximum_schema_size, strict_inclusion);
+
+	int nSchemas = 0;
+
+	def scores = [:]
+	def lensnames = [:]
+	for (def schema : schemas) {
+
+		def allUnites = schema.getUnitesSousjacentesNonTriees()
+		
+		def units = AnalecUtils.filterElements(debug, allUnites, unit_ursql)
+		
+		selectedUnits = AnalecUtils.filterUniteByInclusion(debug, units, corpus.getMatches(), strict_inclusion, position_in_matches)
+		
+		int nUnites = selectedUnits.size();
+
+		if (!scores.containsKey(schema)) {
+			scores[schema] = 0;
+		}
+
+		scores[schema] = units.su
+		
+		String value = schema.getProp(schema_property_display);
+		nSchemas++;
+	}
+
+	//println "nSchemas=$nSchemas"
+	def freqs = lens.keySet();
+	freqs.sort();
+	int t = 0;
+	int n = 0;
+	//println "Fréquences ("+freqs.size()+")"
+	for (def f : freqs) {
+		t += f * lens[f]
+		n += lens[f]
+	}
+
+	if (n == 0) {
+		println "No units selected for schemas=$schema_ursql and units=$unit_ursql"
+		return false;
+	}
+	
+	coef = (t/n)
+	
+	def slens = null
+	if ("freq".equals(sort_column)) {
+		slens = lens.sort { a, b -> -a.value <=> -b.value ?: -a.key <=> -b.key }
+	} else {
+		slens = lens.sort { a, b -> -a.key <=> -b.key ?: -a.value <=> -b.value }
+	}
+	
+	def flens = []
+	slens.each { key, value -> value.times { flens << key } }
+	def nbins = flens.size()*2
+
+	println "Schema scores in '$corpus'. The average schema score is $t/$n = "+coef
+	println "Index:\nlen\tfreq\tcfreq"
+	int nShown = 0;
+	for( def it : slens) {
+		println it.key+"	"+it.value+"	"+(cfreq+=it.value)+"	"+lensnames[it.key].join(", ")
+		nShown++
+		if (max_lines > 0 && nShown >= max_lines) {
+			println "... (${slens.size() - max_lines})"
+			break;
+		}
+	}
+
+	
+	//return ["result":coef, "data":lens]
+}
+
+
Index: tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemaAccessibilityScoresMacro.groovy
===================================================================
--- tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemaAccessibilityScoresMacro.groovy	(revision 2144)
+++ tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemaAccessibilityScoresMacro.groovy	(revision 2145)
@@ -1,148 +0,0 @@
-// Copyright © 2016 ENS de Lyon, CNRS, University of Franche-Comté
-// Licensed under the terms of the GNU General Public License (http://www.gnu.org/licenses)
-// @author mdecorde
-// @author sheiden
-
-// STANDARD DECLARATIONS
-package org.txm.macro.urs.exploit
-
-import org.kohsuke.args4j.*
-import groovy.transform.Field
-import org.txm.rcp.swt.widget.parameters.*
-import org.txm.annotation.urs.*
-import org.txm.macro.urs.AnalecUtils
-import visuAnalec.elements.*
-import org.txm.searchengine.cqp.corpus.*
-import org.txm.Toolbox
-import org.txm.rcp.commands.*
-import org.txm.statsengine.r.core.RWorkspace
-
-def selection = []
-for (def s : corpusViewSelections) {
-	if (s instanceof CQPCorpus) selection << s
-	else if (s instanceof Partition) selection.addAll(s.getParts())
-}
-
-if (selection.size() == 0) {
-	println "** $scriptName: please select a Corpus or a Partition in the Corpus view: "+corpusViewSelections
-	return false
-} else {
-	for (def c : selection) c.compute(false)
-}
-
-@Field @Option(name="schema_ursql", usage="TYPE@PROP=REGEX", widget="String", required=true, def="CHAINE")
-		String schema_ursql
-
-@Field @Option(name="minimum_schema_size", usage="minimal schema size", widget="Integer", required=true, def="3")
-		int minimum_schema_size
-@Field @Option(name="maximum_schema_size", usage="Maximum size needed to consider a schema", widget="Integer", required=true, def="9999999")
-		int maximum_schema_size
-@Field @Option(name="schema_property_display", usage="schema property to show", widget="String", required=true, def="REF")
-		String schema_property_display
-@Field @Option(name="unit_ursql", usage="TYPE@PROP=REGEX", widget="String", required=false, def="MENTION")
-		String unit_ursql
-@Field @Option(name="strict_inclusion", usage="Units must be strictly included into corpus matches", widget="Boolean", required=true, def="true")
-		boolean strict_inclusion
-@Field @Option(name="position_in_matches", usage="Unit distance to structure limit (0 = no selection, 1 = first after limit, -1 = last before limit, etc.)", widget="Integer", required=true, def="0")
-		int position_in_matches
-@Field @Option(name="sep", usage="choose between the len or freq columns", widget="Separator", metaVar="freq	len", required=true, def="")
-		def sep
-@Field @Option(name="sort_column", usage="choose between the len or freq columns", widget="StringArray", metaVar="freq	len", required=true, def="freq")
-		String sort_column
-@Field @Option(name="max_lines", usage="cut the number of lines shown. '0' means no cut", widget="Integer", required=false, def="0")
-		int max_lines
-//@Field @Option(name="output_graph", usage="Show chart", widget="Boolean", required=true, def="false")
-		output_graph = false
-@Field @Option(name="debug", usage="Show internal variable content", widget="StringArray", metaVar="OFF	ON	ALL	REALLY ALL", required=true, def="OFF")
-		debug
-
-if (!ParametersDialog.open(this)) return;
-if (debug == "OFF") debug = 0; else if (debug == "ON") debug = 1; else if (debug == "ALL") debug = 2 else if (debug == "REALLY ALL") debug = 3
-
-for (def corpus : selection) {
-	def analecCorpus = URSCorpora.getCorpus(corpus)
-
-	def errors = AnalecUtils.isPropertyDefined(Schema.class, analecCorpus, schema_ursql)
-	if (errors.size() > 0) {
-		println "** The $schema_ursql schema URSQL cannot be computed in the corpus with types: $errors."
-		return;
-	}
-
-	errors=AnalecUtils.isPropertyDefined(Unite.class, analecCorpus, unit_ursql)
-	if (errors.size() > 0) {
-		println "** $unit_ursql unit URSQL cannot be computed in the corpus with types: $errors."
-		return;
-	}
-
-	def schemas = AnalecUtils.selectSchemasInCorpus(debug, analecCorpus, corpus, schema_ursql, minimum_schema_size, maximum_schema_size, strict_inclusion);
-
-	int nSchemas = 0;
-
-	def scores = [:]
-	def lensnames = [:]
-	for (def schema : schemas) {
-
-		def allUnites = schema.getUnitesSousjacentesNonTriees()
-		
-		def units = AnalecUtils.filterElements(debug, allUnites, unit_ursql)
-		
-		selectedUnits = AnalecUtils.filterUniteByInclusion(debug, units, corpus.getMatches(), strict_inclusion, position_in_matches)
-		
-		int nUnites = selectedUnits.size();
-
-		if (!scores.containsKey(schema)) {
-			scores[schema] = 0;
-		}
-
-		scores[schema] = units.su
-		
-		String value = schema.getProp(schema_property_display);
-		nSchemas++;
-	}
-
-	//println "nSchemas=$nSchemas"
-	def freqs = lens.keySet();
-	freqs.sort();
-	int t = 0;
-	int n = 0;
-	//println "Fréquences ("+freqs.size()+")"
-	for (def f : freqs) {
-		t += f * lens[f]
-		n += lens[f]
-	}
-
-	if (n == 0) {
-		println "No units selected for schemas=$schema_ursql and units=$unit_ursql"
-		return false;
-	}
-	
-	coef = (t/n)
-	
-	def slens = null
-	if ("freq".equals(sort_column)) {
-		slens = lens.sort { a, b -> -a.value <=> -b.value ?: -a.key <=> -b.key }
-	} else {
-		slens = lens.sort { a, b -> -a.key <=> -b.key ?: -a.value <=> -b.value }
-	}
-	
-	def flens = []
-	slens.each { key, value -> value.times { flens << key } }
-	def nbins = flens.size()*2
-
-	println "Schema scores in '$corpus'. The average schema score is $t/$n = "+coef
-	println "Index:\nlen\tfreq\tcfreq"
-	int nShown = 0;
-	for( def it : slens) {
-		println it.key+"	"+it.value+"	"+(cfreq+=it.value)+"	"+lensnames[it.key].join(", ")
-		nShown++
-		if (max_lines > 0 && nShown >= max_lines) {
-			println "... (${slens.size() - max_lines})"
-			break;
-		}
-	}
-
-	
-	//return ["result":coef, "data":lens]
-}
-
-
Index: tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasSummaryMacro.groovy
===================================================================
--- tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasSummaryMacro.groovy	(revision 2144)
+++ tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasSummaryMacro.groovy	(revision 2145)
@@ -50,16 +50,25 @@
 if (!ParametersDialog.open(this)) return
 if (debug == "OFF") debug = 0; else if (debug == "ON") debug = 1; else if (debug == "ALL") debug = 2 else if (debug == "REALLY ALL") debug = 3
 
-def CQI = CQPSearchEngine.getCqiClient()
-
 def allresults = new LinkedHashMap()
 def props = new HashSet()
 for (def corpus : selection) {
 
-	mainCorpus = corpus.getMainCorpus()
-
-	def word = mainCorpus.getWordProperty()
-	def analecCorpus = URSCorpora.getCorpus(mainCorpus)
+	def word = corpus.getWordProperty()
+	def analecCorpus = URSCorpora.getCorpus(corpus)
+	
+	def errors = AnalecUtils.isPropertyDefined(Schema.class, analecCorpus, schema_ursql)
+	if (errors.size() > 0) {
+		println "** The $schema_ursql schema URSQL cannot be computed in the corpus with types: $errors."
+		return;
+	}
+	
+	errors = AnalecUtils.isPropertyDefined(Unite.class, analecCorpus, unit_ursql)
+	if (errors.size() > 0) {
+		println "** $unit_ursql unit URSQL cannot be computed in the corpus with types: $errors."
+		return;
+	}
+	
 	for (def type : analecCorpus.getStructure().getUnites())
 		props.addAll(analecCorpus.getStructure().getUniteProperties(type));
 
Index: tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasProgressionMacro.groovy
===================================================================
--- tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasProgressionMacro.groovy	(revision 2144)
+++ tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasProgressionMacro.groovy	(revision 2145)
@@ -87,8 +87,6 @@
 
 def CQI = CQPSearchEngine.getCqiClient()
 
-
-
 def queries = []
 def queryResults = []
 def informations = []
@@ -191,8 +189,6 @@
 			n++
 		}
 
-
-
 		def queryResult = new FakeQueryResult(corpus.getID(), corpus, query, starts, ends, null)
 
 		queries << query
@@ -229,24 +225,23 @@
 						try {
 							//def charteditorpart = org.txm.chartsengine.rcp.SWTChartsComponentsProvider.openEditor(Application.swtComponentProvider.createProgressionChartEditorPart(IImageKeys.getImage(IImageKeys.ACTION_PROGRESSION), progression, progression.isMonochrome(), progression.isMonostyle(), progression.isDoCumulative()))
 							def charteditorpart = org.txm.chartsengine.rcp.editors.ChartEditor.openEditor(progression);
-//							JFreeChart chart = charteditorpart.getChart()
-//							def plot = chart.getXYPlot()
-//	
-//							ProgressionItemSelectionRenderer renderer = plot.getRenderer();
-//							//renderer.setBaseItemLabelsVisible(true)
-//							//renderer.setBaseLinesVisible(false)
-//							//renderer.setBaseSeriesVisible(SchemasProgressionMacro.this.show_lines, true);
-//							//renderer.setItemLabelsVisible(true)
-//							//renderer.setLinesVisible(false)
-//							renderer.setAdditionalLabelInformation(informations)
-//							renderer.setAdditionalShapeScales(styles)
-//							chart.getLegend().setVisible(SchemasProgressionMacro.this.show_legend)
-//							chart.getTitle().setVisible(SchemasProgressionMacro.this.show_title)
+							JFreeChart chart = charteditorpart.getChart()
+							def plot = chart.getXYPlot()
 	
+							ProgressionItemSelectionRenderer renderer = plot.getRenderer();
+							//renderer.setBaseItemLabelsVisible(true)
+							//renderer.setBaseLinesVisible(false)
+							//renderer.setBaseSeriesVisible(SchemasProgressionMacro.this.show_lines, true);
+							//renderer.setItemLabelsVisible(true)
+							//renderer.setLinesVisible(false)
+							renderer.setAdditionalLabelInformation(informations)
+							renderer.setAdditionalShapeScales(styles)
+							chart.getLegend().setVisible(SchemasProgressionMacro.this.show_legend)
+							chart.getTitle().setVisible(SchemasProgressionMacro.this.show_title)
+	
 						} catch(Exception e) {e.printStackTrace()}
 					}
 				})
-	
 	} catch(Exception e) {
 		e.printStackTrace()
 		return false
Index: tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasListMacro.groovy
===================================================================
--- tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasListMacro.groovy	(revision 2144)
+++ tmp/org.txm.analec.rcp/src/org/txm/macro/urs/exploit/SchemasListMacro.groovy	(revision 2145)
@@ -1,4 +1,4 @@
-// Copyright © 2016 ENS de Lyon, CNRS, University of Franche-Comté
+// Copyright © 2019 ENS de Lyon, CNRS, University of Franche-Comté
 // Licensed under the terms of the GNU General Public License (http://www.gnu.org/licenses)
 // @author mdecorde
 // @author sheiden
@@ -34,31 +34,30 @@
 // BEGINNING OF PARAMETERS
 @Field @Option(name="schema_ursql", usage="TYPE@PROP=VALUE", widget="String", required=true, def="CHAINE")
 String schema_ursql
-
 @Field @Option(name="minimum_schema_size", usage="minimal schema size", widget="Integer", required=true, def="3")
 int minimum_schema_size
 @Field @Option(name="maximum_schema_size", usage="Maximum size needed to consider a schema", widget="Integer", required=true, def="9999999")
 int maximum_schema_size
 @Field @Option(name="unit_ursql", usage="TYPE@PROP=VALUE", widget="String", required=false, def="MENTION")
 String unit_ursql
+@Field @Option(name="cql_limit", usage="CQL to build structure limits", widget="Query", required=false, def="")
+cql_limit
 @Field @Option(name="strict_inclusion", usage="Units must be strictly included into corpus matches", widget="Boolean", required=true, def="true")
 boolean strict_inclusion
+@Field @Option(name="position_in_matches", usage="Unit distance to structure limit (0 = no selection, 1 = first after limit, -1 = last before limit, etc.)", widget="Integer", required=true, def="0")
+int position_in_matches
 @Field @Option(name="word_property", usage="", widget="StringArray", metaVar="word	lemma	frlemma	frolemma	#forme#	id", required=false, def="word")
 String word_property
-
 @Field @Option(name="separator", usage="", widget="String", required=true, def=", ")
 String separator
-
 @Field @Option(name="buildCQL", usage="générer la requête des unités", widget="Boolean", required=true, def='false')
 def buildCQL
-
 @Field @Option(name="debug", usage="Show internal variable content", widget="StringArray", metaVar="OFF	ON	ALL	REALLY ALL", required=true, def="OFF")
 debug
 
 if (!ParametersDialog.open(this)) return;
 if (debug == "OFF") debug = 0; else if (debug == "ON") debug = 1; else if (debug == "ALL") debug = 2 else if (debug == "REALLY ALL") debug = 3
 
-
 for (def corpus : selection) {
 	def analecCorpus = URSCorpora.getCorpus(corpus)
 	
@@ -68,7 +67,7 @@
 		return;
 	}
 	
-	errors=AnalecUtils.isPropertyDefined(Unite.class, analecCorpus, unit_ursql)
+	errors = AnalecUtils.isPropertyDefined(Unite.class, analecCorpus, unit_ursql)
 	if (errors.size() > 0) {
 		println "** $unit_ursql unit URSQL cannot be computed in the corpus with types: $errors."
 		return;
@@ -76,6 +75,7 @@
 	
 	def CQI = CQPSearchEngine.getCqiClient()
 	
+	def word_prop = null
 	if (buildCQL) {
 		word_prop = corpus.getProperty("id")
 	} else {
@@ -84,19 +84,29 @@
 	
 	def schemas = AnalecUtils.selectSchemasInCorpus(debug, analecCorpus, corpus, schema_ursql, minimum_schema_size, maximum_schema_size, strict_inclusion);
 	schemas.sort() {it.getProps()}
-	def nSchemas = 0
 	
-	def lens = [:]
-	
-	println "$corpus schemas (${schemas.size()}):"
+	println "$corpus schemas (${schemas.size()}): "
 	for (def schema : schemas) {
 	
 		def allUnites = schema.getUnitesSousjacentesNonTriees()
 		def units = AnalecUtils.filterElements(debug, allUnites, unit_ursql)
-		units.sort()
+		units = AnalecUtils.filterUniteByInclusion(debug, allUnites, corpus.getMatches(), false, 0)
+
+		if (cql_limit != null) {
+			def cql_limit_matches = null;
+			if (cql_limit != null && !cql_limit.getQueryString().equals("\"\"")) {
+				def limitssubcorpus = corpus.createSubcorpus(cql_limit, corpus.getName().toUpperCase())
+				cql_limit_matches = limitssubcorpus.getMatches();
+				limitssubcorpus.delete();
+			} else {
+				cql_limit_matches = corpus.getMatches()
+			}
+			units = AnalecUtils.filterUniteByInclusion(debug, units, cql_limit_matches, strict_inclusion, position_in_matches)
+		}
 		
-		print schema.getProps().toString()+ ": "
+		print schema.getProps().toString()+ " ("+units.size()+"/"+allUnites.size()+"): "
 		def first = true
+		def values = new HashSet()
 		for (def unit : units) {
 	
 			String forme =  null;
@@ -122,16 +132,14 @@
 					if (unit.getDeb() == unit.getFin()) pos = [unit.getDeb()]
 					else pos = (unit.getDeb()..unit.getFin())
 					
-						forme = StringUtils.join(CQI.cpos2Str(word_prop.getQualifiedName(), pos), " ") // ids is enough
+					forme = StringUtils.join(CQI.cpos2Str(word_prop.getQualifiedName(), pos), " ") // ids is enough
 				}
 	
-				if (first) { first = false } else { print separator }
-				print forme
+				values << forme
 			}
 		}
-		println ""
-	
-		nSchemas++
+		
+		println values.join(separator)
 	}
 }
 
Index: tmp/org.txm.analec.rcp/src/org/txm/macro/urs/AnalecUtils.groovy
===================================================================
--- tmp/org.txm.analec.rcp/src/org/txm/macro/urs/AnalecUtils.groovy	(revision 2144)
+++ tmp/org.txm.analec.rcp/src/org/txm/macro/urs/AnalecUtils.groovy	(revision 2145)
@@ -104,7 +104,7 @@
  */
 static def selectUnitsInSchema(def debug, Corpus analecCorpus, org.txm.searchengine.cqp.corpus.CQPCorpus corpus,
 		String schema_ursql, Integer minimum_schema_size, Integer maximum_schema_size,
-		String unit_ursql, Integer position_in_schema, CQLQuery cql_limit, Boolean strict_inclusion, int position) {
+		String unit_ursql, Integer position_in_schema, CQLQuery cql_limit, Boolean strict_inclusion, int position_in_matches) {
 	def groupedUnits = []
 	if (schema_ursql != null && schema_ursql.length() > 0 || minimum_schema_size > 1) {
 		def allSchema = null;
@@ -137,7 +137,7 @@
 	if (debug >= 2) println "matches=${matches}"
 	def allUnits = []
 	for (def k : groupedUnits.keySet()) {
-		def selectedUnits = AnalecUtils.filterUniteByInclusion(debug, groupedUnits[k], matches, strict_inclusion, position)
+		def selectedUnits = AnalecUtils.filterUniteByInclusion(debug, groupedUnits[k], matches, strict_inclusion, position_in_matches)
 		allUnits.addAll(selectedUnits)
 	}
 	if (debug >= 2) println "selectedUnits=${allUnits.size()}"
Index: tmp/org.txm.analec.rcp/src/org/txm/macro/urs/DemoMacro.groovy
===================================================================
--- tmp/org.txm.analec.rcp/src/org/txm/macro/urs/DemoMacro.groovy	(revision 2144)
+++ tmp/org.txm.analec.rcp/src/org/txm/macro/urs/DemoMacro.groovy	(revision 2145)
@@ -2,6 +2,7 @@
 
 import org.txm.annotation.urs.URSCorpora
 import org.txm.searchengine.cqp.corpus.CQPCorpus
+import visuAnalec.elements.*
 
 // get the CQP corpus
 if (!(corpusViewSelection instanceof CQPCorpus)) {
@@ -10,51 +11,113 @@
 }
 def corpus = corpusViewSelection
 
-// get the Analec corpus
+// get the Analec corpus : stores the annotations and annotation structure
+
 def analecCorpus = URSCorpora.getCorpus(corpus)
 
-// get the annotations structure
+// get the annotations structure : stores the available annotation types, properties and values
+
 def structure = analecCorpus.getStructure()
 
-// get the annotations view
+// get the annotations view : stores annotations and annotation structure display rules
+
 def view = URSCorpora.getVue(corpus)
 
-// get annotations
+// display annotations per Element type (Unite, Relation, Schema) and per type
 
-	// Units
-	println "Units:"
-	for (String type : structure.getUnites()) {
-		def units = analecCorpus.getUnites(type)
-		if (units.size() > 0) {
-			println "	${units.size()} $type"
-		}
-	}
+	// Create annotation type
 	
-	// Relations
-	println "Relations:"
-	for (String type : structure.getRelations()) {
-		def relations = analecCorpus.getRelations(type)
-		if (relations.size() > 0) {
-			println "	${relations.size()} $type"
-		}
-	}
+	structure.ajouterType(Unite.class, "EXEMPLE");
+	//structure.ajouterType(Relation.class, "EXEMPLE");
+	//structure.ajouterType(Schema.class, "EXEMPLE");
+	println structure.getTypes(Unite.class)
 	
-	// Schemas
-	println "Schemas:"
-	for (String type : structure.getSchemas()) {
-		def schemas = analecCorpus.getSchemas(type)
-		if (schemas.size() > 0) {
-			println "	${schemas.size()} $type"
-		}
-	}
+	// Create annotation property
 	
+	structure.ajouterProp(Unite.class, "EXEMPLE", "PEXEMPLE")
+	println structure.getNomsProps(Unite.class, "EXEMPLE")
+	
+	// Create annotation value
+	
+	structure.ajouterVal(Unite.class, "EXEMPLE", "PEXEMPLE", "oui")
+	structure.ajouterVal(Unite.class, "EXEMPLE", "PEXEMPLE", "non")
+	
 	// Create annotations
 	
+	def props = [:]
+	props["PEXEMPLE"] = "oui"
+	def u = analecCorpus.addUniteSaisie("EXEMPLE", 0, 10, props)
+	println u
+	
 	// Edit annotations
-
+	
+	u.getProps()["EXEMPLE"] = "non"
+	
+	// Unit getters
+	
+	println u.getDeb() // start of unit
+	println u.getFin() // end of unit
+	
+	println u.getProp("EXEMPLE")
+	println u.getType()
+	
+	// Browse Units
+	
+		println "Units:"
+		for (String type : structure.getUnites()) {
+			def units = analecCorpus.getUnites(type)
+			if (units.size() > 0) {
+				println "	${units.size()} $type"
+			}
+		}
+		
+		// Browse Relations
+		
+		println "Relations:"
+		for (String type : structure.getRelations()) {
+			def relations = analecCorpus.getRelations(type)
+			if (relations.size() > 0) {
+				println "	${relations.size()} $type"
+			}
+		}
+		
+		// Browse Schemas
+		
+		println "Schemas:"
+		for (String type : structure.getSchemas()) {
+			def schemas = analecCorpus.getSchemas(type)
+			if (schemas.size() > 0) {
+				println "	${schemas.size()} $type"
+			}
+		}
+	
 	// Delete annotations
 	
+	analecCorpus.supUnite(u)
+	//analecCorpus.supRelation(rel)
+	//analecCorpus.supSchema(sch)
+	
+	// Delete annotation value
+	
+	structure.supprimerVal(Unite.class, "EXEMPLE", "PEXEMPLE", "oui")
+	structure.supprimerVal(Unite.class, "EXEMPLE", "PEXEMPLE", "non")
+	
+	// Delete annotation property
+	
+	structure.supprimerProp(Unite.class, "EXEMPLE", "PEXEMPLE")
+	
+	// Delete annotation type
+	
+	structure.supprimerType(Unite.class, "EXEMPLE");
+	//structure.supprimerType(Relation.class, "EXEMPLE");
+	//structure.supprimerType(Schema.class, "EXEMPLE");
+	
 	// Revert changes
 	
+	//URSCorpora.revert(corpus);
+	
 	// Save changes
-	URSCorpora.getView(corpus)
\ No newline at end of file
+	
+	//URSCorpora.saveCorpus(corpus)
+	
+	
\ No newline at end of file
Index: tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/highcharts/defaulttheme/renderers/ItemSelectionXYStepRenderer.java
===================================================================
--- tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/highcharts/defaulttheme/renderers/ItemSelectionXYStepRenderer.java	(revision 2144)
+++ tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/highcharts/defaulttheme/renderers/ItemSelectionXYStepRenderer.java	(revision 2145)
@@ -452,12 +452,11 @@
  		   super.drawItem(g2, state, dataArea, info, plot, domainAxis, rangeAxis, dataset, series, item, crosshairState, pass);
  		   
  		  // force shape rendering because the XYStepRenderer doesn't manage it by default
-//  		  EntityCollection entities = null;
-//           if(info != null) {
-//           	entities = info.getOwner().getEntityCollection();
-//           }
-//
-//           drawSecondaryPass(g2, plot, dataset, pass, series, item, domainAxis, dataArea, rangeAxis, crosshairState, entities);
+ 		  EntityCollection entities = null;
+          if(info != null) {
+          	entities = info.getOwner().getEntityCollection();
+          }
+          drawSecondaryPass(g2, plot, dataset, pass, series, item, domainAxis, dataArea, rangeAxis, crosshairState, entities);
  	   }
     }
 
Index: tmp/org.txm.groovy.core/src/java/org/txm/groovy/core/GSERunner.java
===================================================================
--- tmp/org.txm.groovy.core/src/java/org/txm/groovy/core/GSERunner.java	(revision 2144)
+++ tmp/org.txm.groovy.core/src/java/org/txm/groovy/core/GSERunner.java	(revision 2145)
@@ -95,11 +95,19 @@
 		defaultGSE.setConfig(configuration);
 		
 		File jardir = new File(rootDir, "lib"); //$NON-NLS-1$
+		try {
+			defaultGSE.getGroovyClassLoader().addClasspath(jardir.getAbsolutePath());
+			defaultGSE.getGroovyClassLoader().addURL(jardir.toURI().toURL());
+		} catch (MalformedURLException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
 		if (jardir.exists() && jardir.isDirectory()) {
 			for (File f: jardir.listFiles(new FilenameFilter() {
 				@Override
 				public boolean accept(File dir, String name) {
-					return name.endsWith(".jar"); //$NON-NLS-1$
+					return name.endsWith(".jar") || name.endsWith(".so") || name.endsWith(".dylib") || name.endsWith(".dll"); //$NON-NLS-1$
 				}
 			}))
 			{
