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 2561)
+++ tmp/org.txm.searchengine.cqp.core/src/org/txm/searchengine/cqp/corpus/Partition.java	(revision 2562)
@@ -272,7 +272,7 @@
 	
 	@Override
 	public boolean canCompute() {
-		return this.getParent() != null && (this.pProperty != null || (this.pQueries != null && this.pQueries.size() > 0));
+		return this.getParent() != null && (this.pProperty != null || (this.pQueries != null && this.pQueries != null));
 	}
 	
 	@Override
@@ -452,7 +452,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public List<Part> getParts() {
-		return (List<Part>) this.getChildren(Part.class);
+		return this.getChildren(Part.class);
 	}
 	
 	/**
@@ -686,7 +686,7 @@
 		
 		tmp = this.getStringParameterValue(CQPPreferences.PART_NAMES);
 		if (tmp != null) {
-			this.pPartNames = Arrays.asList(tmp.split("\t"));
+			this.pPartNames = new ArrayList<String>(Arrays.asList(tmp.split("\t")));
 		}
 		else {
 			this.pPartNames = null;
@@ -694,7 +694,7 @@
 		
 		tmp = this.getStringParameterValue(TXMPreferences.QUERIES);
 		if (tmp != null) {
-			this.pQueries = Arrays.asList(tmp.split("\t"));
+			this.pQueries = new ArrayList<String>(Arrays.asList(tmp.split("\t")));
 		}
 		else {
 			this.pQueries = null;
@@ -702,7 +702,7 @@
 		
 		tmp = this.getStringParameterValue(TXMPreferences.VALUES);
 		if (tmp != null) {
-			this.pValues = Arrays.asList(tmp.split("\t"));
+			this.pValues = new ArrayList<String>(Arrays.asList(tmp.split("\t")));
 		}
 		else {
 			this.pValues = null;
@@ -768,5 +768,23 @@
 	public CQPCorpus getCorpus() {
 		return (CQPCorpus) parent;
 	}
+
+	public Object getPartForName(String pName) {
+		if (pName == null) return null;
+		
+		for (Part p : getChildren(Part.class)) {
+			if (pName.equals(p.getName())) {
+				return p;
+			}
+		}
+		return null;
+	}
+
+	public List<String> getQueriesParameter() {
+		return pQueries;
+	}
 	
+	public List<String> getPartNamesParameter() {
+		return pPartNames;
+	}
 }
Index: tmp/org.txm.searchengine.cqp.rcp/plugin.xml
===================================================================
--- tmp/org.txm.searchengine.cqp.rcp/plugin.xml	(revision 2561)
+++ tmp/org.txm.searchengine.cqp.rcp/plugin.xml	(revision 2562)
@@ -181,9 +181,14 @@
                style="push">
             <visibleWhen
                   checkEnabled="false">
-               <reference
-                     definitionId="OneCorpusSelected">
-               </reference>
+               <or>
+                  <reference
+                        definitionId="OneCorpusSelected">
+                  </reference>
+                  <reference
+                        definitionId="OnePartitionSelected">
+                  </reference>
+               </or>
             </visibleWhen>
          </command>
       </menuContribution>
Index: tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/handlers/base/ComputePartition.java
===================================================================
--- tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/handlers/base/ComputePartition.java	(revision 2561)
+++ tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/handlers/base/ComputePartition.java	(revision 2562)
@@ -28,6 +28,7 @@
 package org.txm.searchengine.cqp.rcp.handlers.base;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -100,6 +101,7 @@
 		Partition part = null;
 		if (firstElement instanceof CQPCorpus) {
 			part = new Partition((CQPCorpus)firstElement);
+			part.setParameters("", new ArrayList<String>(), new ArrayList<String>());
 		} else if (firstElement instanceof Partition) {
 			part = (Partition)firstElement;
 		}
Index: tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/editor/PartitionEditor.java
===================================================================
--- tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/editor/PartitionEditor.java	(revision 2561)
+++ tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/editor/PartitionEditor.java	(revision 2562)
@@ -1,27 +1,294 @@
 package org.txm.searchengine.cqp.rcp.editor;
 
 import org.apache.commons.lang.StringUtils;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.CellLabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.txm.core.preferences.TXMPreferences;
+import org.txm.core.results.Parameter;
 import org.txm.rcp.editors.TXMEditor;
+import org.txm.rcp.editors.listeners.ComputeKeyListener;
+import org.txm.rcp.swt.widget.AssistedQueryWidget;
+import org.txm.rcp.views.corpora.CorporaView;
+import org.txm.searchengine.cqp.clientExceptions.CqiClientException;
+import org.txm.searchengine.cqp.corpus.Part;
 import org.txm.searchengine.cqp.corpus.Partition;
-import org.txm.searchengine.cqp.corpus.Subcorpus;
+import org.txm.utils.logger.Log;
 
 public class PartitionEditor extends TXMEditor<Partition> {
 
-	Label partitionInfo;
-	Label partsInfo;
+	TableViewer partsViewer;
+	TableViewerColumn nameColumn;
+	TableViewerColumn queryColumn;
+	TableViewerColumn sizeColumn;
+	private Label miniInfoLabel;
 	
+	@Parameter(key=TXMPreferences.USER_NAME)
+	private Text nameWidget;
+	
+	private Text partNameWidget;
+	private AssistedQueryWidget queryWidget;
+	
 	@Override
 	public void _createPartControl() throws Exception {
-		partitionInfo = new Label(this.getResultArea(), SWT.NONE);
-		partitionInfo.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false));
 		
-		partsInfo = new Label(this.getResultArea(), SWT.NONE);
-		partitionInfo.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, true));
+		getResult().compute(false); // ensure Parts are ready
+		
+		ComputeKeyListener computeKeyListener = new ComputeKeyListener(this);
+		
+		getMainParametersComposite().getLayout().numColumns = 7;
+		
+		Label l = new Label(getMainParametersComposite(), SWT.NONE);
+		l.setText("Name");
+		l.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+		
+		nameWidget = new Text(getMainParametersComposite(), SWT.BORDER);
+		nameWidget.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+		nameWidget.addModifyListener(new ModifyListener() {
+			
+			@Override
+			public void modifyText(ModifyEvent e) {
+				getResult().setUserName(nameWidget.getText());
+				getResult().saveParameter(TXMPreferences.USER_NAME, nameWidget.getText());
+				
+				CorporaView.refreshObject(getResult());
+			}
+		});
+		
+		l = new Label(getMainParametersComposite(), SWT.SEPARATOR | SWT.VERTICAL);
+		l.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+		
+		miniInfoLabel = new Label(getMainParametersComposite(), SWT.NONE);
+		miniInfoLabel.setText("Add a part");
+		miniInfoLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+		
+		partNameWidget = new Text(getMainParametersComposite(), SWT.BORDER);
+		partNameWidget.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+		
+		// [ (v)]
+		// queryWidget = new QueryWidget(queryArea, SWT.DROP_DOWN);
+		queryWidget = new AssistedQueryWidget(getMainParametersComposite(), SWT.DROP_DOWN, getResult().getCorpus());
+		queryWidget.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		queryWidget.addKeyListener(new ComputeKeyListener(this) {
+			@Override
+			public void keyPressed(KeyEvent e) {
+				if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
+					try {
+						if (queryWidget.getQueryString().length() > 0 && onPlusButtonPressed(null, queryWidget.getQueryString())) {
+							super.keyPressed(e); // recompute only if the query has been added
+							queryWidget.clearQuery();
+						} else {
+							queryWidget.setText(queryWidget.getQueryString());
+						}
+					} catch (Exception e1) {
+						// TODO Auto-generated catch block
+						e1.printStackTrace();
+					}
+				}
+			}
+		});
+		queryWidget.getQueryWidget().addModifyListener(computeKeyListener);
+		
+		Button addNewQueryButton = new Button(getMainParametersComposite(), SWT.PUSH);
+		addNewQueryButton.setText("+");
+		addNewQueryButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+		addNewQueryButton.addSelectionListener(new SelectionListener() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				try {
+					if (queryWidget.getQueryString().length() > 0 && onPlusButtonPressed(null, queryWidget.getQueryString())) {
+						compute(true);
+						queryWidget.clearQuery();
+					} else {
+						queryWidget.setText(queryWidget.getQueryString());
+					}
+				} catch (Exception e1) {
+					// TODO Auto-generated catch block
+					e1.printStackTrace();
+				}
+			}
+			
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) { }
+		});
+		
+		partsViewer = new TableViewer(this.getResultArea());
+		partsViewer.getTable().setLayoutData(GridDataFactory.fillDefaults().align(GridData.FILL, GridData.FILL).grab(true, true).create());
+		partsViewer.getTable().setHeaderVisible(true);
+		partsViewer.getTable().setLinesVisible(true);
+		
+		partsViewer.getTable().addKeyListener(new KeyListener() {
+			
+			@Override
+			public void keyReleased(KeyEvent e) {
+				if (e.keyCode == SWT.DEL) {
+					ISelection isel = partsViewer.getSelection();
+					IStructuredSelection sel = (IStructuredSelection)isel;
+					Object o = sel.getFirstElement();
+					if (o != null && o instanceof Part) {
+						Part p = (Part)o;
+						p.delete();
+						partsViewer.setInput(getResult());
+						try {
+							updateEditorFromResult(false);
+						} catch (Exception e1) {
+							// TODO Auto-generated catch block
+							e1.printStackTrace();
+						}
+					}
+				}
+			}
+			
+			@Override
+			public void keyPressed(KeyEvent e) {}
+		});
+		
+		partsViewer.setContentProvider(new ITreeContentProvider() {
+			
+			@Override
+			public Object[] getElements(Object inputElement) {
+				if (inputElement instanceof Partition) {
+					return ((Partition)inputElement).getParts().toArray();
+				}
+								
+				return new Object[0];
+			}
+			
+			@Override
+			public Object[] getChildren(Object parentElement) {
+				return new Object[0];
+			}
+			
+			@Override
+			public Object getParent(Object element) {
+				return getResult();
+			}
+			
+			@Override
+			public boolean hasChildren(Object element) {
+				return false;
+			}
+		});
+		
+		nameColumn = new TableViewerColumn(partsViewer, SWT.NONE);
+		nameColumn.getColumn().setText("Name");
+		nameColumn.getColumn().pack();
+		nameColumn.setLabelProvider(new CellLabelProvider() {
+			
+			@Override
+			public void update(ViewerCell cell) {
+				Object element = cell.getElement();
+				
+				if (element instanceof Part) {
+					Part part = (Part)element;
+					cell.setText(part.getName());
+				} else {
+					cell.setText("not part");
+				}
+			}
+		});
+		
+		queryColumn = new TableViewerColumn(partsViewer, SWT.NONE);
+		queryColumn.getColumn().setText("Query");
+		queryColumn.getColumn().pack();
+		queryColumn.setLabelProvider(new CellLabelProvider() {
+			
+			@Override
+			public void update(ViewerCell cell) {
+				Object element = cell.getElement();
+				
+				if (element instanceof Part) {
+					Part part = (Part)element;
+					cell.setText(part.getQuery().toString());
+				} else {
+					cell.setText("not part");
+				}
+			}
+		});
+		
+		sizeColumn = new TableViewerColumn(partsViewer, SWT.NONE);
+		sizeColumn.getColumn().setText("Size");
+		sizeColumn.getColumn().pack();
+		sizeColumn.setLabelProvider(new CellLabelProvider() {
+			
+			@Override
+			public void update(ViewerCell cell) {
+				Object element = cell.getElement();
+				
+				if (element instanceof Part) {
+					Part part = (Part)element;
+					try {
+						cell.setText(""+part.getSize());
+					} catch (CqiClientException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+				} else {
+					cell.setText("not part");
+				}
+			}
+		});
+		
+		partsViewer.setInput(getResult());
 	}
 
+	/**
+	 * 
+	 * @param event
+	 * @param query
+	 * @return
+	 * @throws Exception 
+	 */
+	public boolean onPlusButtonPressed(Event event, String query) throws Exception {
+		System.out.println("Add part: "+query);
+		String pName = partNameWidget.getText().trim();
+		if (pName.length() == 0) {
+			Log.warning("no part name set.");
+			return false;
+		}
+		if (query.length() == 0) {
+			Log.warning("no part query set.");
+			return false;
+		}
+		if (getResult().getPartForName(pName) != null) {
+			Log.warning(NLS.bind("A part with the '{0}' name already exists.", pName));
+			return false;
+		}
+		
+		Part p = new Part(getResult(), pName, queryWidget.getQueryString());
+		if (p.compute()) { // the part is OK, update the partition parameters
+			getResult().getQueriesParameter().add(query);
+			getResult().getPartNamesParameter().add(pName);
+			compute(false);
+			
+			updateEditorFromResult(false);
+		} else {
+			Log.warning("Can't compute the part with query: "+query);
+			p.delete();
+		}
+		
+		return false;
+	}
+	
 	@Override
 	public void updateResultFromEditor() {
 		// nothing to do
@@ -29,7 +296,6 @@
 
 	@Override
 	public void updateEditorFromResult(boolean update) throws Exception {
-		partitionInfo.setText(getResult().getDetails());
-		partsInfo.setText(StringUtils.join(getResult().getParts(), "\n"));
+		partsViewer.setInput(getResult());
 	}
 }
