diff --git a/bundles/org.eclipse.test.performance.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.test.performance.ui/META-INF/MANIFEST.MF
index 2e40a62..c41b334 100644
--- a/bundles/org.eclipse.test.performance.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.test.performance.ui/META-INF/MANIFEST.MF
@@ -10,12 +10,10 @@
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.core.runtime,
  org.junit,
- org.eclipse.ui.views;bundle-version="3.4.0";resolution:=optional,
  org.eclipse.test.performance;bundle-version="3.14.0",
- org.eclipse.ui;bundle-version="3.5.0";resolution:=optional
+ org.eclipse.swt;bundle-version="3.5.0";resolution:=optional
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Export-Package: org.eclipse.test.internal.performance.results.db;x-internal:=true,
- org.eclipse.test.internal.performance.results.model;x-internal:=true,
  org.eclipse.test.internal.performance.results.ui;x-internal:=true,
  org.eclipse.test.internal.performance.results.utils;x-internal:=true,
  org.eclipse.test.performance.ui
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsElement.java
deleted file mode 100644
index a1a9a9f..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsElement.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test.internal.performance.results.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.test.internal.performance.data.Dim;
-import org.eclipse.test.internal.performance.eval.StatisticsUtil;
-import org.eclipse.test.internal.performance.results.db.AbstractResults;
-import org.eclipse.test.internal.performance.results.db.BuildResults;
-import org.eclipse.test.internal.performance.results.db.ConfigResults;
-import org.eclipse.test.internal.performance.results.utils.Util;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-public class BuildResultsElement extends ResultsElement {
-
-	// Property descriptors
-    static final String P_ID_BUILD_DATE = "BuildResultsElement.date"; //$NON-NLS-1$
-    static final String P_ID_BUILD_BASELINE = "BuildResultsElement.baseline"; //$NON-NLS-1$
-    static final String P_ID_BUILD_COMMENT = "BuildResultsElement.comment"; //$NON-NLS-1$
-    static final String P_ID_BUILD_SUMMARY_KIND = "BuildResultsElement.summarykind"; //$NON-NLS-1$
-    static final String P_ID_BUILD_IS_BASELINE = "BuildResultsElement.isbaseline"; //$NON-NLS-1$
-    static final String P_ID_BUILD_FAILURE = "BuildResultsElement.failure"; //$NON-NLS-1$
-    static final String P_ID_BUILD_DELTA = "BuildResultsElement.delta"; //$NON-NLS-1$
-    static final String P_ID_BUILD_ERROR = "BuildResultsElement.error"; //$NON-NLS-1$
-    static final String P_ID_BUILD_TTEST = "BuildResultsElement.ttest"; //$NON-NLS-1$
-
-    static final String P_STR_BUILD_DATE = "date"; //$NON-NLS-1$
-    static final String P_STR_BUILD_COMMENT = "comment"; //$NON-NLS-1$
-    static final String P_STR_BUILD_SUMMARY_KIND = "summary kind"; //$NON-NLS-1$
-    static final String P_STR_BUILD_IS_BASELINE = "is baseline"; //$NON-NLS-1$
-    static final String P_STR_BUILD_BASELINE = "baseline"; //$NON-NLS-1$
-    static final String P_STR_BUILD_FAILURE = "failure"; //$NON-NLS-1$
-    static final String P_STR_BUILD_DELTA = "delta with baseline"; //$NON-NLS-1$
-    static final String P_STR_BUILD_ERROR = "delta error"; //$NON-NLS-1$
-    static final String P_STR_BUILD_TTEST = "student's ttest"; //$NON-NLS-1$
-
-	private static final TextPropertyDescriptor BUILD_DATE_DESCRIPTOR = new TextPropertyDescriptor(P_ID_BUILD_DATE, P_STR_BUILD_DATE);
-	private static final TextPropertyDescriptor BUILD_COMMENT_DESCRIPTOR = new TextPropertyDescriptor(P_ID_BUILD_COMMENT, P_STR_BUILD_COMMENT);
-	private static final TextPropertyDescriptor BUILD_SUMMARY_DESCRIPTOR = new TextPropertyDescriptor(P_ID_BUILD_SUMMARY_KIND, P_STR_BUILD_SUMMARY_KIND);
-	private static final PropertyDescriptor BUILD_IS_BASELINE_DESCRIPTOR = new PropertyDescriptor(P_ID_BUILD_IS_BASELINE, P_STR_BUILD_IS_BASELINE);
-	private static final PropertyDescriptor BUILD_BASELINE_DESCRIPTOR = new PropertyDescriptor(P_ID_BUILD_BASELINE, P_STR_BUILD_BASELINE);
-	private static final TextPropertyDescriptor BUILD_TEST_FAILURE_DESCRIPTOR = new TextPropertyDescriptor(P_ID_BUILD_FAILURE, P_STR_BUILD_FAILURE);
-	private static final PropertyDescriptor BUILD_TEST_DELTA_DESCRIPTOR = new PropertyDescriptor(P_ID_BUILD_DELTA, P_STR_BUILD_DELTA);
-	private static final PropertyDescriptor BUILD_TEST_ERROR_DESCRIPTOR = new PropertyDescriptor(P_ID_BUILD_ERROR, P_STR_BUILD_ERROR);
-	private static final PropertyDescriptor BUILD_STUDENTS_TTEST_DESCRIPTOR = new PropertyDescriptor(P_ID_BUILD_TTEST, P_STR_BUILD_TTEST);
-
-    private static Vector<IPropertyDescriptor> DESCRIPTORS;
-    static Vector<IPropertyDescriptor> initDescriptors(int status) {
-		DESCRIPTORS = new Vector<>();
-		// Status category
-		DESCRIPTORS.add(getInfosDescriptor(status));
-		DESCRIPTORS.add(getWarningsDescriptor(status));
-		DESCRIPTORS.add(ERROR_DESCRIPTOR);
-		ERROR_DESCRIPTOR.setCategory("Status");
-		// Results category
-        DESCRIPTORS.add(BUILD_DATE_DESCRIPTOR);
-		BUILD_DATE_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.add(BUILD_BASELINE_DESCRIPTOR);
-		BUILD_BASELINE_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.add(BUILD_COMMENT_DESCRIPTOR);
-		BUILD_COMMENT_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.add(BUILD_SUMMARY_DESCRIPTOR);
-		BUILD_SUMMARY_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.add(BUILD_IS_BASELINE_DESCRIPTOR);
-		BUILD_IS_BASELINE_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.add(BUILD_TEST_FAILURE_DESCRIPTOR);
-		BUILD_TEST_FAILURE_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.add(BUILD_TEST_DELTA_DESCRIPTOR);
-		BUILD_TEST_DELTA_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.add(BUILD_TEST_ERROR_DESCRIPTOR);
-		BUILD_TEST_ERROR_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.add(BUILD_STUDENTS_TTEST_DESCRIPTOR);
-		BUILD_STUDENTS_TTEST_DESCRIPTOR.setCategory("Results");
-		// Survey category
-		DESCRIPTORS.add(COMMENT_DESCRIPTOR);
-		COMMENT_DESCRIPTOR.setCategory("Survey");
-        return DESCRIPTORS;
-	}
-    static ComboBoxPropertyDescriptor getInfosDescriptor(int status) {
-		List<String> list = new ArrayList<>();
-		if ((status & SMALL_VALUE) != 0) {
-			list.add("This test and/or its variation has a small value, hence it may not be necessary to spend time on fixing it if a regression occurs");
-		}
-		if ((status & STUDENT_TTEST) != 0) {
-			list.add("The student-t test error on this test is over the threshold");
-		}
-		String[] infos = new String[list.size()];
-		if (list.size() > 0) {
-			list.toArray(infos);
-		}
-		ComboBoxPropertyDescriptor infoDescriptor = new ComboBoxPropertyDescriptor(P_ID_STATUS_INFO, P_STR_STATUS_INFO, infos);
-		infoDescriptor.setCategory("Status");
-		return infoDescriptor;
-	}
-    static PropertyDescriptor getWarningsDescriptor(int status) {
-		List<String> list = new ArrayList<>();
-		if ((status & BIG_ERROR) != 0) {
-			list.add("The error on this test is over the 3% threshold, hence its result may not be really reliable");
-		}
-		if ((status & NOT_RELIABLE) != 0) {
-			list.add("The results history shows that the variation of its delta is over 20%, hence its result is surely not reliable");
-		}
-		if ((status & NOT_STABLE) != 0) {
-			list.add("The results history shows that the variation of its delta is between 10% and 20%, hence its result may not be really reliable");
-		}
-		if ((status & NO_BASELINE) != 0) {
-			list.add("There's no baseline to compare with");
-		}
-		if ((status & SINGLE_RUN) != 0) {
-			list.add("This test has only one run, hence no error can be computed to verify if it's stable enough to be reliable");
-		}
-		String[] warnings = new String[list.size()];
-		if (list.size() > 0) {
-			list.toArray(warnings);
-		}
-		ComboBoxPropertyDescriptor warningDescriptor = new ComboBoxPropertyDescriptor(P_ID_STATUS_WARNING, P_STR_STATUS_WARNING, warnings);
-		warningDescriptor.setCategory("Status");
-		return warningDescriptor;
-    }
-    static Vector<IPropertyDescriptor> getDescriptors() {
-    	return DESCRIPTORS;
-	}
-
-	    // Model info
-	boolean important;
-	boolean milestone;
-
-public BuildResultsElement(AbstractResults results, ResultsElement parent) {
-	super(results, parent);
-}
-
-public BuildResultsElement(String name, ResultsElement parent) {
-	super(name, parent);
-}
-
-@Override
-public int compareTo(ResultsElement o) {
-	if (o instanceof BuildResultsElement && getName() != null) {
-		BuildResultsElement element = (BuildResultsElement) o;
-		if (element.getName() != null) {
-			String buildDate = Util.getBuildDate(element.name);
-			return Util.getBuildDate(this.name).compareTo(buildDate);
-		}
-	}
-	return super.compareTo(o);
-}
-
-@Override
-ResultsElement createChild(AbstractResults testResults) {
-	return null;
-}
-
-BuildResults getBuildResults() {
-	return (BuildResults) this.results;
-}
-
-@Override
-public Object[] getChildren(Object o) {
-	if (this.results == null) {
-		return new Object[0];
-	}
-	if (this.children == null) {
-		initChildren();
-	}
-	return this.children;
-}
-
-@Override
-public Object getEditableValue() {
-	if (this.results == null)  {
-		return "Build "+this.name;
-	}
-	return this.results.toString();
-}
-
-@Override
-public IPropertyDescriptor[] getPropertyDescriptors() {
-	Vector<IPropertyDescriptor> descriptors = getDescriptors();
-	if (descriptors == null) {
-		descriptors = initDescriptors(getStatus());
-	}
-	int size = descriptors.size();
-	IPropertyDescriptor[] descriptorsArray = new IPropertyDescriptor[size];
-	descriptorsArray[0] = getInfosDescriptor(getStatus());
-	descriptorsArray[1] = getWarningsDescriptor(getStatus());
-	for (int i=2; i<size; i++) {
-		descriptorsArray[i] = descriptors.get(i);
-	}
-	return descriptorsArray;
-}
-
-@Override
-public Object getPropertyValue(Object propKey) {
-	BuildResults buildResults = getBuildResults();
-	if (buildResults != null) {
-		ConfigResults configResults = (ConfigResults) buildResults.getParent();
-		BuildResults baselineResults = configResults.getBaselineBuildResults(buildResults.getName());
-	    if (propKey.equals(P_ID_BUILD_DATE))
-	        return buildResults.getDate();
-	    if (propKey.equals(P_ID_BUILD_COMMENT))
-	        return buildResults.getComment();
-	    if (propKey.equals(P_ID_BUILD_SUMMARY_KIND)) {
-	    	int summaryKind = buildResults.getSummaryKind();
-			if (summaryKind == 1) {
-	    		return "global";
-	    	}
-	    	if (summaryKind >= 0) {
-	    		return "component";
-	    	}
-	    	return "none";
-	    }
-	    if (propKey.equals(P_ID_BUILD_IS_BASELINE))
-	        return Boolean.valueOf(buildResults.isBaseline());
-	    if (propKey.equals(P_ID_BUILD_FAILURE))
-	        return buildResults.getFailure();
-	    if (baselineResults != null) {
-		    if (propKey.equals(P_ID_BUILD_BASELINE)) {
-		        return baselineResults.getName();
-		    }
-			double buildValue = buildResults.getValue();
-			double baselineValue = baselineResults.getValue();
-			double delta = (baselineValue - buildValue) / baselineValue;
-			if (Double.isNaN(delta)) {
-			    if (propKey.equals(P_ID_BUILD_DELTA) || propKey.equals(P_ID_BUILD_ERROR)) {
-			        return Double.valueOf(Double.NaN);
-			    }
-			} else  if (propKey.equals(P_ID_BUILD_DELTA)) {
-				return Double.valueOf(delta);
-		    } else {
-				long baselineCount = baselineResults.getCount();
-				long currentCount = buildResults.getCount();
-				if (baselineCount > 1 && currentCount > 1) {
-					if (propKey.equals(P_ID_BUILD_TTEST)) {
-						double ttestValue = Util.computeTTest(baselineResults, buildResults);
-						int degreeOfFreedom = (int) (baselineResults.getCount()+buildResults.getCount()-2);
-						if (ttestValue >= 0 && StatisticsUtil.getStudentsT(degreeOfFreedom, StatisticsUtil.T90) >= ttestValue) {
-							return Double.valueOf(ttestValue);
-						}
-					}
-				    if (propKey.equals(P_ID_BUILD_ERROR)) {
-						double baselineError = baselineResults.getError();
-						double currentError = buildResults.getError();
-						double error = Double.isNaN(baselineError)
-								? currentError / baselineValue
-								: Math.sqrt(baselineError*baselineError + currentError*currentError) / baselineValue;
-				        return Double.valueOf(error);
-				    }
-				} else {
-				    if (propKey.equals(P_ID_BUILD_ERROR))
-				        return Double.valueOf(-1);
-				}
-			}
-	    }
-	}
-	if (propKey.equals(P_ID_STATUS_ERROR)) {
-		if ((getStatus() & BIG_DELTA) != 0) {
-			return "The delta on this test is over the 10% threshold, hence may indicate a possible regression.";
-		}
-	}
-	return super.getPropertyValue(propKey);
-}
-
-/**
- * Return the statistics of the build along its history.
- *
- * @return An array of double built as follows:
- * <ul>
- * <li>0:	numbers of values</li>
- * <li>1:	mean of values</li>
- * <li>2:	standard deviation of these values</li>
- * <li>3:	coefficient of variation of these values</li>
- * </ul>
- */
-@Override
-double[] getStatistics() {
-	if (this.statistics  == null) {
-		this.statistics = ((ConfigResults)getBuildResults().getParent()).getStatistics(Util.BASELINE_BUILD_PREFIXES);
-	}
-	return this.statistics;
-}
-
-@Override
-void initChildren() {
-	BuildResults buildResults = (BuildResults) this.results;
-	Dim[] dimensions = buildResults.getDimensions();
-	int length = dimensions.length;
-	this.children = new DimResultsElement[length];
-	for (int i=0; i<length; i++) {
-		this.children[i] = new DimResultsElement(this.results, this, dimensions[i]);
-	}
-}
-
-@Override
-void initStatus() {
-	if (this.results == null) {
-		if (this.parent.isInitialized()) {
-			if (((PerformanceResultsElement) this.parent).hasRead(this)) {
-				this.status = READ;
-			} else {
-				this.status = UNREAD;
-			}
-		} else {
-			this.status = UNKNOWN;
-		}
-	} else if (getBuildResults().isBaseline()) {
-		// TODO (frederic) report high variation in baseline results along history
-		this.status = READ;
-	} else {
-		initStatus(getBuildResults());
-	}
-}
-
-/**
- * Returns whether the build is important to be shown.
- * This is the case for milestone builds or for the last builds.
- *
- * @return <code>true</code>  or <code>false</code> .
- */
-public boolean isImportant() {
-	return this.important;
-}
-
-public boolean isRead() {
-	return (getStatus()  & STATE_MASK) == READ;
-}
-
-public boolean isUnknown() {
-	return (getStatus()  & STATE_MASK) == UNKNOWN;
-}
-
-@Override
-public String toString() {
-	return getName();
-}
-public boolean isBefore(String build) {
-	if (this.results != null) {
-		return Util.getBuildDate(this.name).compareTo(Util.getBuildDate(build)) <= 0;
-	}
-	return true;
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsProperties.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsProperties.java
deleted file mode 100644
index c694b04..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsProperties.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test.internal.performance.results.model;
-
-import java.util.Vector;
-
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-public class BuildResultsProperties {
-
-	    // Property descriptors
-    static final String P_ID_SMALL_VALUE = "BuildResultsProperties.small_value"; //$NON-NLS-1$
-    static final String P_ID_NO_BASELINE = "BuildResultsProperties.no_baseline"; //$NON-NLS-1$
-    static final String P_ID_SINGLE_RUN = "BuildResultsProperties.single_run"; //$NON-NLS-1$
-    static final String P_ID_BIG_ERROR = "BuildResultsProperties.big_error"; //$NON-NLS-1$
-    static final String P_ID_STUDENT_TTEST = "BuildResultsProperties.ttest"; //$NON-NLS-1$
-    static final String P_ID_NOT_STABLE = "BuildResultsProperties.not_stable"; //$NON-NLS-1$
-    static final String P_ID_NOT_RELIABLE = "BuildResultsProperties.not_reliable"; //$NON-NLS-1$
-    static final String P_ID_BIG_DELTA = "BuildResultsProperties.big_delta"; //$NON-NLS-1$
-    static final String P_STR_SMALL_VALUE = "small value"; //$NON-NLS-1$
-    static final String P_STR_NO_BASELINE = "no baseline"; //$NON-NLS-1$
-    static final String P_STR_SINGLE_RUN = "single run"; //$NON-NLS-1$
-    static final String P_STR_BIG_ERROR = "big error"; //$NON-NLS-1$
-    static final String P_STR_STUDENT_TTEST = "student ttest"; //$NON-NLS-1$
-    static final String P_STR_NOT_STABLE = "not stable"; //$NON-NLS-1$
-    static final String P_STR_NOT_RELIABLE = "not reliable"; //$NON-NLS-1$
-    static final String P_STR_BIG_DELTA = "delta error"; //$NON-NLS-1$
-    private static Vector<IPropertyDescriptor> descriptors;
-    static {
-        descriptors = new Vector<>();
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_SMALL_VALUE, P_STR_SMALL_VALUE));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_NO_BASELINE, P_STR_NO_BASELINE));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_SINGLE_RUN, P_STR_SINGLE_RUN));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_BIG_ERROR, P_STR_BIG_ERROR));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_STUDENT_TTEST, P_STR_STUDENT_TTEST));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_NOT_STABLE, P_STR_NOT_STABLE));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_NOT_RELIABLE, P_STR_NOT_RELIABLE));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_BIG_DELTA, P_STR_BIG_DELTA));
-    }
-    static Vector<IPropertyDescriptor> getDescriptors() {
-        return descriptors;
-	}
-
-    private int status;
-
-public BuildResultsProperties() {
-}
-
-void setStatus(int status) {
-	this.status = status;
-}
-
-public Object getEditableValue() {
-	return null;
-}
-
-public IPropertyDescriptor[] getPropertyDescriptors() {
-    return getDescriptors().toArray(
-            new IPropertyDescriptor[getDescriptors().size()]);
-}
-
-public Object getPropertyValue(Object propKey) {
-	if (propKey.equals(P_ID_SMALL_VALUE)) {
-		if ((this.status & ResultsElement.SMALL_VALUE) != 0) {
-			return "This test and/or its variation has a small value, hence it may not be necessary to spend time on fixing it if a regression occurs.";
-		}
-	}
-	if (propKey.equals(P_ID_NO_BASELINE)) {
-		if ((this.status & ResultsElement.NO_BASELINE) != 0) {
-			return "There's no baseline to compare with.";
-		}
-	}
-	if (propKey.equals(P_ID_SINGLE_RUN)) {
-		if ((this.status & ResultsElement.SINGLE_RUN) != 0) {
-			return "This test has only one run, hence no error can be computed to verify if it's stable enough to be reliable.";
-		}
-	}
-	if (propKey.equals(P_ID_BIG_ERROR)) {
-		if ((this.status & ResultsElement.BIG_ERROR) != 0) {
-			return "The error on this test is over the 3% threshold, hence its result may not be really reliable.";
-		}
-	}
-	if (propKey.equals(P_ID_STUDENT_TTEST)) {
-		if ((this.status & ResultsElement.STUDENT_TTEST) != 0) {
-			return "The student-t on this test is over the threshold";
-		}
-	}
-	if (propKey.equals(P_ID_NOT_STABLE)) {
-		if ((this.status & ResultsElement.NOT_STABLE) != 0) {
-			return "The results history shows that the variation of its delta is between 10% and 20%, hence its result may not be really reliable.";
-		}
-	}
-	if (propKey.equals(P_ID_NOT_RELIABLE)) {
-		if ((this.status & ResultsElement.NOT_RELIABLE) != 0) {
-			return "The results history shows that the variation of its delta is over 20%, hence its result is surely not reliable.";
-		}
-	}
-	if (propKey.equals(P_ID_BIG_DELTA)) {
-		if ((this.status & ResultsElement.BIG_DELTA) != 0) {
-			return "The delta on this test is over the 10% threshold, hence may indicate a possible regression.";
-		}
-	}
-	return null;
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ComponentResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ComponentResultsElement.java
deleted file mode 100644
index 3c61515..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ComponentResultsElement.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test.internal.performance.results.model;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.test.internal.performance.results.db.AbstractResults;
-import org.eclipse.test.internal.performance.results.db.ComponentResults;
-import org.eclipse.test.internal.performance.results.db.PerformanceResults;
-import org.eclipse.test.internal.performance.results.db.ScenarioResults;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-public class ComponentResultsElement extends ResultsElement {
-
-	// Property descriptors
-	static final String P_ID_NAME = "ComponentResultsElement.name"; //$NON-NLS-1$
-	static final String P_ID_CURRENT_BUILD = "ComponentResultsElement.currentbuild"; //$NON-NLS-1$
-	static final String P_ID_BASELINE_BUILD = "ComponentResultsElement.baselinebuild"; //$NON-NLS-1$
-
-	static final String P_STR_NAME = "name"; //$NON-NLS-1$
-	static final String P_STR_CURRENT_BUILD = "current build"; //$NON-NLS-1$
-	static final String P_STR_BASELINE_BUILD = "baseline build"; //$NON-NLS-1$
-
-	private static final TextPropertyDescriptor NAME_DESCRIPTOR = new TextPropertyDescriptor(P_ID_NAME, P_STR_NAME);
-	private static final PropertyDescriptor CURRENT_BUILD_DESCRIPTOR = new PropertyDescriptor(P_ID_CURRENT_BUILD, P_STR_CURRENT_BUILD);
-	private static final PropertyDescriptor BASELINE_BUILD_DESCRIPTOR = new PropertyDescriptor(P_ID_BASELINE_BUILD, P_STR_BASELINE_BUILD);
-
-    private static Vector<IPropertyDescriptor> DESCRIPTORS;
-    static Vector<IPropertyDescriptor> initDescriptors(int status) {
-        DESCRIPTORS = new Vector<>();
-		// Status category
-		DESCRIPTORS.add(getInfosDescriptor(status));
-		DESCRIPTORS.add(getWarningsDescriptor(status));
-		DESCRIPTORS.add(ERROR_DESCRIPTOR);
-		ERROR_DESCRIPTOR.setCategory("Status");
-		// Results category
-		DESCRIPTORS.addElement(NAME_DESCRIPTOR);
-		NAME_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(CURRENT_BUILD_DESCRIPTOR);
-		CURRENT_BUILD_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(BASELINE_BUILD_DESCRIPTOR);
-		BASELINE_BUILD_DESCRIPTOR.setCategory("Results");
-		// Survey category
-		DESCRIPTORS.add(COMMENT_DESCRIPTOR);
-		COMMENT_DESCRIPTOR.setCategory("Survey");
-        return DESCRIPTORS;
-	}
-    static Vector<IPropertyDescriptor> getDescriptors() {
-    	return DESCRIPTORS;
-	}
-
-public ComponentResultsElement(String name, ResultsElement parent) {
-	super(name, parent);
-}
-
-public ComponentResultsElement(AbstractResults results, ResultsElement parent) {
-	super(results, parent);
-}
-
-/*
- * Do not create non-fingerprint child when only fingerprint is specified.
- *
- * @see org.eclipse.test.internal.performance.results.model.ResultsElement#createChild(org.eclipse.test.internal.performance.results.db.AbstractResults)
- */
-@Override
-ResultsElement createChild(AbstractResults testResults) {
-//	if (onlyFingerprints()) {
-//		ScenarioResults scenarioResults = (ScenarioResults) testResults;
-//		if (!scenarioResults.hasSummary()) {
-//			return null;
-//		}
-//	}
-	return new ScenarioResultsElement(testResults, this);
-}
-
-/**
- * Get all results numbers for a given machine of the current component.
- *
- * @param configName The name of the configuration to get numbers
- * @param fingerprints Set whether only fingerprints scenario should be taken into account
- * @return A list of lines. Each line represent a build and is a list of either strings or values.
- */
-public List<List<Object>> getConfigNumbers(String configName, boolean fingerprints) {
-	if (this.results == null) return null;
-	return ((ComponentResults)this.results).getConfigNumbers(configName, fingerprints, new ArrayList<>());
-}
-
-@Override
-public IPropertyDescriptor[] getPropertyDescriptors() {
-	Vector<IPropertyDescriptor> descriptors = getDescriptors();
-	if (descriptors == null) {
-		descriptors = initDescriptors(getStatus());
-	}
-	int size = descriptors.size();
-	IPropertyDescriptor[] descriptorsArray = new IPropertyDescriptor[size];
-	descriptorsArray[0] = getInfosDescriptor(getStatus());
-	descriptorsArray[1] = getWarningsDescriptor(getStatus());
-	for (int i=2; i<size; i++) {
-		descriptorsArray[i] = descriptors.get(i);
-	}
-	return descriptorsArray;
-}
-
-@Override
-public Object getPropertyValue(Object propKey) {
-	if (propKey.equals(P_ID_NAME)) {
-		return getName();
-	}
-	if (propKey.equals(P_ID_CURRENT_BUILD)) {
-		if (this.results == null) {
-			PerformanceResultsElement performanceResultsElement = (PerformanceResultsElement) getParent(null);
-			return performanceResultsElement.getName();
-		}
-		PerformanceResults performanceResults = (PerformanceResults) this.results.getParent();
-		return performanceResults.getName();
-	}
-	if (propKey.equals(P_ID_BASELINE_BUILD)) {
-		if (this.results == null) {
-			return "?";
-		}
-		PerformanceResults performanceResults = (PerformanceResults) this.results.getParent();
-		return performanceResults.getBaselineName();
-	}
-    return super.getPropertyValue(propKey);
-}
-
-/**
- * Get the list of the scenarios results from the model. Put only fingerprint ones if specified.
- *
- * @param fingerprint Tell whether only fingerprint scenarios are expected or not.
- * @return A list of {@link ScenarioResults}.
- */
-public List<AbstractResults> getScenarios(boolean fingerprint) {
-	if (!fingerprint) {
-		return Arrays.asList(this.results.getChildren());
-	}
-	List<AbstractResults> scenarios = new ArrayList<>();
-	if (this.results != null) {
-		Iterator<AbstractResults> iterator = this.results.getResults();
-		while (iterator.hasNext()) {
-			ScenarioResults scenarioResults = (ScenarioResults) iterator.next();
-			if (scenarioResults.hasSummary()) {
-				scenarios.add(scenarioResults);
-			}
-		}
-	}
-	return scenarios;
-}
-
-/**
- * Get the list of the scenarios names. Put only fingerprint ones if specified.
- *
- * @param fingerprint Tell whether only fingerprint scenarios are expected or not.
- * @return A list of {@link String}.
- */
-public List<String> getScenariosLabels(boolean fingerprint) {
-	List<String> labels = new ArrayList<>();
-	if (this.results != null) {
-		AbstractResults[] scenarios = this.results.getChildren();
-		int length = scenarios.length;
-		for (int i=0; i<length; i++) {
-			ScenarioResults scenarioResults = (ScenarioResults) scenarios[i];
-			if (!fingerprint || scenarioResults.hasSummary()) {
-				labels.add(scenarioResults.getLabel());
-			}
-		}
-	}
-	return labels;
-}
-
-@Override
-void initStatus() {
-	if (this.results == null) {
-		this.status = UNREAD;
-	} else {
-		super.initStatus();
-	}
-}
-
-@Override
-StringBuilder getFailures(StringBuilder buffer, int kind, StringBuilder excluded) {
-	// Write status for scenarios having error
-	if ((getStatus() & ERROR_MASK) != 0) {
-
-		// Get children status
-		StringBuilder childrenBuffer = super.getFailures(new StringBuilder(), kind, excluded);
-
-		// Write status on file if not excluded
-		if (childrenBuffer.length() > 0) {
-			buffer.append(getName());
-			IEclipsePreferences preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-			String comment = preferences.get(getId(), null);
-			if (comment != null) {
-				if ((kind & IPerformancesConstants.STATUS_VALUES) != 0) {
-					buffer.append("												");
-				} else {
-					buffer.append("			");
-				}
-				buffer.append(comment);
-			}
-			buffer.append(Util.LINE_SEPARATOR);
-			buffer.append(childrenBuffer);
-			buffer.append(Util.LINE_SEPARATOR);
-		}
-	}
-	return buffer;
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ConfigResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ConfigResultsElement.java
deleted file mode 100644
index 89f3d4f..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ConfigResultsElement.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test.internal.performance.results.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.test.internal.performance.results.db.AbstractResults;
-import org.eclipse.test.internal.performance.results.db.ConfigResults;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-public class ConfigResultsElement extends ResultsElement {
-
-	// Elements
-	BuildResultsElement currentBuild, baselineBuild;
-
-	// Property descriptors
-	static final String P_ID_CONFIG_NAME = "ConfigResultsElement.name"; //$NON-NLS-1$
-	static final String P_ID_CONFIG_DESCRIPTION = "ConfigResultsElement.description"; //$NON-NLS-1$
-	static final String P_ID_CONFIG_CURRENT_BUILD = "ConfigResultsElement.currentbuild"; //$NON-NLS-1$
-	static final String P_ID_CONFIG_BASELINE_BUILD = "ConfigResultsElement.baselinebuild"; //$NON-NLS-1$
-	static final String P_ID_CONFIG_BASELINED = "ConfigResultsElement.baselined"; //$NON-NLS-1$
-	static final String P_ID_CONFIG_VALID = "ConfigResultsElement.valid"; //$NON-NLS-1$
-	static final String P_ID_CONFIG_DELTA = "ConfigResultsElement.delta"; //$NON-NLS-1$
-	static final String P_ID_CONFIG_ERROR = "ConfigResultsElement.error"; //$NON-NLS-1$
-
-	static final String P_STR_CONFIG_NAME = "internal name"; //$NON-NLS-1$
-	static final String P_STR_CONFIG_DESCRIPTION = "description"; //$NON-NLS-1$
-	static final String P_STR_CONFIG_CURRENT_BUILD = "current build"; //$NON-NLS-1$
-	static final String P_STR_CONFIG_BASELINE_BUILD = "baseline build"; //$NON-NLS-1$
-	static final String P_STR_CONFIG_BASELINED = "has baseline"; //$NON-NLS-1$
-	static final String P_STR_CONFIG_VALID = "is valid"; //$NON-NLS-1$
-	static final String P_STR_CONFIG_DELTA = "delta with baseline"; //$NON-NLS-1$
-	static final String P_STR_CONFIG_ERROR = "delta error"; //$NON-NLS-1$
-
-	private static final TextPropertyDescriptor CONFIG_NAME_DESCRIPTOR = new TextPropertyDescriptor(P_ID_CONFIG_NAME, P_STR_CONFIG_NAME);
-	private static final TextPropertyDescriptor CONFIG_DESCRIPTION_DESCRIPTOR = new TextPropertyDescriptor(P_ID_CONFIG_DESCRIPTION, P_STR_CONFIG_DESCRIPTION);
-	private static final PropertyDescriptor CONFIG_CURRENT_BUILD_DESCRIPTOR = new PropertyDescriptor(P_ID_CONFIG_CURRENT_BUILD, P_STR_CONFIG_CURRENT_BUILD);
-	private static final PropertyDescriptor CONFIG_BASELINE_BUILD_DESCRIPTOR = new PropertyDescriptor(P_ID_CONFIG_BASELINE_BUILD, P_STR_CONFIG_BASELINE_BUILD);
-	private static final PropertyDescriptor CONFIG_BASELINED_DESCRIPTOR = new PropertyDescriptor(P_ID_CONFIG_BASELINED, P_STR_CONFIG_BASELINED);
-	private static final PropertyDescriptor CONFIG_VALID_DESCRIPTOR = new PropertyDescriptor(P_ID_CONFIG_VALID, P_STR_CONFIG_VALID);
-	private static final PropertyDescriptor CONFIG_DELTA_DESCRIPTOR = new PropertyDescriptor(P_ID_CONFIG_DELTA, P_STR_CONFIG_DELTA);
-	private static final PropertyDescriptor CONFIG_ERROR_DESCRIPTOR = new PropertyDescriptor(P_ID_CONFIG_ERROR, P_STR_CONFIG_ERROR);
-
-    private static Vector<IPropertyDescriptor> DESCRIPTORS;
-    static Vector<IPropertyDescriptor> initDescriptors(int status) {
-		DESCRIPTORS = new Vector<>();
-		// Status category
-		DESCRIPTORS.add(getInfosDescriptor(status));
-		DESCRIPTORS.add(getWarningsDescriptor(status));
-		DESCRIPTORS.add(ERROR_DESCRIPTOR);
-		ERROR_DESCRIPTOR.setCategory("Status");
-		// Results category
-		DESCRIPTORS.addElement(CONFIG_NAME_DESCRIPTOR);
-		CONFIG_NAME_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(CONFIG_DESCRIPTION_DESCRIPTOR);
-		CONFIG_DESCRIPTION_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(CONFIG_CURRENT_BUILD_DESCRIPTOR);
-		CONFIG_CURRENT_BUILD_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(CONFIG_BASELINE_BUILD_DESCRIPTOR);
-		CONFIG_BASELINE_BUILD_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(CONFIG_BASELINED_DESCRIPTOR);
-		CONFIG_BASELINED_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(CONFIG_VALID_DESCRIPTOR);
-		CONFIG_VALID_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(CONFIG_DELTA_DESCRIPTOR);
-		CONFIG_DELTA_DESCRIPTOR.setCategory("Results");
-		DESCRIPTORS.addElement(CONFIG_ERROR_DESCRIPTOR);
-		CONFIG_ERROR_DESCRIPTOR.setCategory("Results");
-		// Survey category
-		DESCRIPTORS.add(COMMENT_DESCRIPTOR);
-		COMMENT_DESCRIPTOR.setCategory("Survey");
-		return DESCRIPTORS;
-	}
-    static ComboBoxPropertyDescriptor getInfosDescriptor(int status) {
-		List<String> list = new ArrayList<>();
-		if ((status & SMALL_VALUE) != 0) {
-			list.add("This test and/or its variation has a small value on this machine, hence it may not be necessary to spend time on fixing it if a regression occurs");
-		}
-		if ((status & STUDENT_TTEST) != 0) {
-			list.add("The student-t test error on this machine is over the threshold");
-		}
-		String[] infos = new String[list.size()];
-		if (list.size() > 0) {
-			list.toArray(infos);
-		}
-		ComboBoxPropertyDescriptor infoDescriptor = new ComboBoxPropertyDescriptor(P_ID_STATUS_INFO, P_STR_STATUS_INFO, infos);
-		infoDescriptor.setCategory("Status");
-		return infoDescriptor;
-	}
-    static PropertyDescriptor getWarningsDescriptor(int status) {
-		List<String> list = new ArrayList<>();
-		if ((status & BIG_ERROR) != 0) {
-			list.add("The error on this machine is over the 3% threshold, hence its result may not be really reliable");
-		}
-		if ((status & NOT_RELIABLE) != 0) {
-			list.add("The results history for this machine shows that the variation of its delta is over 20%, hence its result is surely not reliable");
-		}
-		if ((status & NOT_STABLE) != 0) {
-			list.add("The results history for this machine shows that the variation of its delta is between 10% and 20%, hence its result may not be really reliable");
-		}
-		if ((status & NO_BASELINE) != 0) {
-			list.add("There's no baseline for this machine to compare with");
-		}
-		if ((status & SINGLE_RUN) != 0) {
-			list.add("This test has only one run on this machine, hence no error can be computed to verify if it's stable enough to be reliable");
-		}
-		if ((status & STUDENT_TTEST) != 0) {
-			list.add("The student-t test error on this machine is over the threshold");
-		}
-		String[] warnings = new String[list.size()];
-		if (list.size() > 0) {
-			list.toArray(warnings);
-		}
-		ComboBoxPropertyDescriptor warningDescriptor = new ComboBoxPropertyDescriptor(P_ID_STATUS_WARNING, P_STR_STATUS_WARNING, warnings);
-		warningDescriptor.setCategory("Status");
-		return warningDescriptor;
-	}
-    static Vector<IPropertyDescriptor> getDescriptors() {
-    	return DESCRIPTORS;
-	}
-
-public ConfigResultsElement(AbstractResults results, ResultsElement parent) {
-	super(results, parent);
-}
-
-@Override
-ResultsElement createChild(AbstractResults testResults) {
-	return new BuildResultsElement(testResults, this);
-}
-
-BuildResultsElement getBaselineBuild() {
-	if (this.baselineBuild == null) {
-		this.baselineBuild = new BuildResultsElement(getConfigResults().getBaselineBuildResults(), this);
-	}
-	return this.baselineBuild;
-}
-
-/**
- * Get the baseline build used for this configuration.
- *
- * @param buildName The name of the build to have the baseline
- * @return The baseline build as {@link BuildResultsElement}.
- */
-public String getBaselineBuildName(String buildName) {
-	return getConfigResults().getBaselineBuildResults(buildName).getName();
-}
-
-private ConfigResults getConfigResults() {
-	return (ConfigResults) this.results;
-}
-
-BuildResultsElement getCurrentBuild() {
-	if (this.currentBuild == null) {
-		this.currentBuild = new BuildResultsElement(getConfigResults().getCurrentBuildResults(), this);
-	}
-	return this.currentBuild;
-}
-
-@Override
-public String getLabel(Object o) {
-	String description = getConfigResults().getDescription();
-	int index = description.indexOf(" (");
-	if (index <= 0) {
-		return description;
-	}
-	return description.substring(0, index);
-}
-
-@Override
-public IPropertyDescriptor[] getPropertyDescriptors() {
-	Vector<IPropertyDescriptor> descriptors = getDescriptors();
-	if (descriptors == null) {
-		descriptors = initDescriptors(getStatus());
-	}
-	int size = descriptors.size();
-	IPropertyDescriptor[] descriptorsArray = new IPropertyDescriptor[size];
-	descriptorsArray[0] = getInfosDescriptor(getStatus());
-	descriptorsArray[1] = getWarningsDescriptor(getStatus());
-	for (int i=2; i<size; i++) {
-		descriptorsArray[i] = descriptors.get(i);
-	}
-	return descriptorsArray;
-}
-
-@Override
-public Object getPropertyValue(Object propKey) {
-	ConfigResults configResults = getConfigResults();
-	if (propKey.equals(P_ID_CONFIG_NAME)) {
-		return configResults.getName();
-	}
-	if (propKey.equals(P_ID_CONFIG_DESCRIPTION)) {
-		return configResults.getDescription();
-	}
-	if (propKey.equals(P_ID_CONFIG_CURRENT_BUILD)) {
-		return getCurrentBuild();
-	}
-	if (propKey.equals(P_ID_CONFIG_BASELINE_BUILD)) {
-		return getBaselineBuild();
-	}
-	if (propKey.equals(P_ID_CONFIG_BASELINED)) {
-		return Boolean.valueOf(configResults.isBaselined());
-	}
-	if (propKey.equals(P_ID_CONFIG_VALID)) {
-		return Boolean.valueOf(configResults.isValid());
-	}
-	if (propKey.equals(P_ID_CONFIG_DELTA)) {
-		return Double.valueOf(configResults.getDelta());
-	}
-	if (propKey.equals(P_ID_CONFIG_ERROR)) {
-		return Double.valueOf(configResults.getError());
-	}
-	if (propKey.equals(P_ID_STATUS_ERROR)) {
-		if (getStatus() == MISSING) {
-			PerformanceResultsElement performanceResultsElement = (PerformanceResultsElement) ((ResultsElement)((ResultsElement)getParent(null)).getParent(null)).getParent(null);
-			return "No result for build "+performanceResultsElement.getName()+" on this machine!";
-		}
-		if ((getStatus() & BIG_DELTA) != 0) {
-			return "The delta on this machine is over the 10% threshold, hence may indicate a possible regression";
-		}
-	}
-	return super.getPropertyValue(propKey);
-}
-
-/**
- * Return the statistics of the build along its history.
- *
- * @return An array of double built as follows:
- * <ul>
- * <li>0:	numbers of values</li>
- * <li>1:	mean of values</li>
- * <li>2:	standard deviation of these values</li>
- * <li>3:	coefficient of variation of these values</li>
- * </ul>
- */
-@Override
-public double[] getStatistics() {
-	if (this.statistics  == null) {
-		this.statistics = getConfigResults().getStatistics(Util.BASELINE_BUILD_PREFIXES);
-	}
-	return this.statistics;
-}
-
-@Override
-void initStatus() {
-	ConfigResults configResults = getConfigResults();
-	if (configResults.isValid()) {
-		initStatus(configResults.getCurrentBuildResults());
-	} else {
-		this.status = MISSING;
-	}
-}
-
-/*
- * Write the element status in the given stream
- */
-@Override
-StringBuilder getFailures(StringBuilder buffer, int kind, StringBuilder excluded) {
-	if ((this.status & BIG_DELTA) != 0) { // there's a failure on this config
-
-		// Get numbers
-		int buildsNumber = kind & IPerformancesConstants.STATUS_BUILDS_NUMBER_MASK;
-		ConfigResults configResults = getConfigResults();
-		double[][] numbers = configResults.getLastNumbers(buildsNumber);
-		int numbersLength = numbers.length;
-
-		// if there are several builds to confirm the regression, then verify all deltas
-		if (numbersLength > 1) {
-			if (numbersLength < buildsNumber) {
-				// there's not enough builds to wee whether there's a real regression, hence skip result
-				if (excluded != null) {
-					excluded.append(configResults+" excluded from status because there's only "+numbersLength+" builds available although "+buildsNumber+" is required to decide a regression is confirmed or not!");
-					excluded.append(Util.LINE_SEPARATOR);
-				}
-				return buffer;
-			}
-			int confirmed = 1;
-			for (int i=1; i<numbersLength; i++) {
-				if (numbers[i] != null && numbers[i][AbstractResults.DELTA_VALUE_INDEX] < -0.1) {
-					confirmed++;
-				}
-			}
-			float ratio = ((float) confirmed) / numbersLength;
-			if (ratio < 0.8) {
-				// more than 20% of previous build didn't fail, hence skip result
-				if (excluded != null) {
-					excluded.append(configResults+" excluded from status because only "+confirmed+" builds failed on last "+buildsNumber+" ones!");
-					excluded.append(Util.LINE_SEPARATOR);
-				}
-				return buffer;
-			}
-		}
-
-		// Add values
-		double[] values = numbers[0];
-		double buildValue = values[AbstractResults.BUILD_VALUE_INDEX];
-		double baselineValue = values[AbstractResults.BASELINE_VALUE_INDEX];
-		double delta = values[AbstractResults.DELTA_VALUE_INDEX];
-		double error = values[AbstractResults.DELTA_ERROR_INDEX];
-		StringBuilder localBuffer = new StringBuilder("		");
-		localBuffer.append(configResults.getName());
-		double[] stats = null;
-		boolean printValues = (kind & IPerformancesConstants.STATUS_VALUES) != 0;
-		if (printValues) {
-			localBuffer.append("	");
-			localBuffer.append(buildValue);
-			localBuffer.append("	");
-			localBuffer.append(baselineValue);
-			localBuffer.append("	");
-			localBuffer.append(buildValue-baselineValue);
-			localBuffer.append("	");
-			localBuffer.append(Util.PERCENTAGE_FORMAT.format(delta));
-			localBuffer.append("	");
-			localBuffer.append(Util.PERCENTAGE_FORMAT.format(error));
-			stats = getStatistics();
-			if (stats != null) {
-				localBuffer.append("	");
-				localBuffer.append((int) stats[0]);
-				localBuffer.append("	");
-				localBuffer.append(Util.DOUBLE_FORMAT.format(stats[1]));
-				localBuffer.append("	");
-				localBuffer.append(Util.DOUBLE_FORMAT.format(stats[2]));
-				localBuffer.append("	");
-				localBuffer.append(Util.PERCENTAGE_FORMAT.format(stats[3]));
-			}
-		}
-
-		/* Add comment
-		IEclipsePreferences preferences = new InstanceScope().getNode(IPerformancesConstants.PLUGIN_ID);
-		String comment = preferences.get(getId(), null);
-		if (comment != null) {
-			if (stats == null && printValues) {
-				buffer.append("				");
-			}
-			buffer.append("	");
-			buffer.append(comment);
-		}
-		*/
-
-		// Add status info
-		if (this.status != BIG_DELTA) { // there's some other info in the status
-//			if (comment == null) {
-				if (stats == null && printValues) {
-					localBuffer.append("				");
-				}
-//			}
-			localBuffer.append("	");
-			String separator = "";
-
-			// Error
-			if ((this.status & BIG_ERROR) != 0) {
-				int statusErrorLevel = kind & IPerformancesConstants.STATUS_ERROR_LEVEL_MASK;
-				if (statusErrorLevel == IPerformancesConstants.STATUS_ERROR_NOTICEABLE) {
-					// Skip result
-					if (excluded != null) {
-						excluded.append(configResults+" excluded from status due to a noticeable error!");
-						excluded.append(Util.LINE_SEPARATOR);
-					}
-					return buffer;
-				}
-				localBuffer.append(separator);
-				localBuffer.append("error (");
-				localBuffer.append(Util.PERCENTAGE_FORMAT.format(error));
-				localBuffer.append(")");
-				separator = "+";
-				double ratio = -(error/delta);
-				if (ratio > 1) {
-					switch (statusErrorLevel) {
-						case IPerformancesConstants.STATUS_ERROR_INVALID:
-						case IPerformancesConstants.STATUS_ERROR_WEIRD:
-						case IPerformancesConstants.STATUS_ERROR_SUSPICIOUS:
-							// Skip result
-							if (excluded != null) {
-								excluded.append(configResults+" excluded from status due to an invalid error!");
-								excluded.append(Util.LINE_SEPARATOR);
-							}
-							return buffer;
-					}
-					localBuffer.append(": invalid measure!");
-				} else if (ratio > 0.5) {
-					switch (statusErrorLevel) {
-						case IPerformancesConstants.STATUS_ERROR_WEIRD:
-						case IPerformancesConstants.STATUS_ERROR_SUSPICIOUS:
-							// Skip result
-							if (excluded != null) {
-								excluded.append(configResults+" excluded from status due to a weird error!");
-								excluded.append(Util.LINE_SEPARATOR);
-							}
-							return buffer;
-					}
-					localBuffer.append(": weird measure!");
-				} else if (ratio > 0.25) {
-					if (statusErrorLevel == IPerformancesConstants.STATUS_ERROR_SUSPICIOUS) {
-						// Skip result
-						if (excluded != null) {
-							excluded.append(configResults+" excluded from status due to a suspicious error!");
-							excluded.append(Util.LINE_SEPARATOR);
-						}
-						return buffer;
-					}
-					localBuffer.append(": suspicious measure!");
-				}
-			}
-
-			// Small value
-			if ((this.status & SMALL_VALUE) != 0) {
-				int statusSmallValue = kind & IPerformancesConstants.STATUS_SMALL_VALUE_MASK;
-				localBuffer.append(separator);
-				if (buildValue < 100) {
-					if (statusSmallValue == IPerformancesConstants.STATUS_SMALL_VALUE_BUILD) {
-						// Skip result
-						if (excluded != null) {
-							excluded.append(configResults+" excluded from status due to a small build value!");
-							excluded.append(Util.LINE_SEPARATOR);
-						}
-						return buffer;
-					}
-					localBuffer.append("small build value (");
-					localBuffer.append((int)buildValue);
-					localBuffer.append("ms)");
-				}
-				int diff = (int) Math.abs(baselineValue - buildValue);
-				if (diff < 100) {
-					if (statusSmallValue == IPerformancesConstants.STATUS_SMALL_VALUE_DELTA) {
-						// Skip result
-						if (excluded != null) {
-							excluded.append(configResults+" excluded from status due to a small delta value!");
-							excluded.append(Util.LINE_SEPARATOR);
-						}
-						return buffer;
-					}
-					localBuffer.append("small delta value (");
-					localBuffer.append(diff);
-					localBuffer.append("ms)");
-				}
-				separator = "+";
-			}
-
-			// Statistics
-			if ((this.status & NOT_RELIABLE) != 0) {
-				switch (kind & IPerformancesConstants.STATUS_STATISTICS_MASK) {
-					case IPerformancesConstants.STATUS_STATISTICS_UNSTABLE:
-					case IPerformancesConstants.STATUS_STATISTICS_ERRATIC:
-						// Skip result
-						if (excluded != null) {
-							excluded.append(configResults+" excluded from status due to erratic statistics!");
-							excluded.append(Util.LINE_SEPARATOR);
-						}
-						return buffer;
-				}
-				localBuffer.append(separator);
-				localBuffer.append("erratic");
-				separator = "+";
-			} else if ((this.status & NOT_STABLE) != 0) {
-				if ((kind & IPerformancesConstants.STATUS_STATISTICS_UNSTABLE) != 0) {
-					// Skip result
-					if (excluded != null) {
-						excluded.append(configResults+" excluded from status due to unstable statistics!");
-						excluded.append(Util.LINE_SEPARATOR);
-					}
-					return buffer;
-				}
-				localBuffer.append(separator);
-				localBuffer.append("unstable");
-				separator = "+";
-			}
-		}
-
-		// Write status
-		buffer.append(localBuffer);
-		buffer.append(Util.LINE_SEPARATOR);
-	}
-	return buffer;
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/DimResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/DimResultsElement.java
deleted file mode 100644
index e517d28..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/DimResultsElement.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test.internal.performance.results.model;
-
-import java.util.Vector;
-
-import org.eclipse.test.internal.performance.data.Dim;
-import org.eclipse.test.internal.performance.results.db.AbstractResults;
-import org.eclipse.test.internal.performance.results.db.BuildResults;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-public class DimResultsElement extends ResultsElement {
-
-	Dim dim;
-
-	// Property descriptors
-    static final String P_ID_DIMENSION = "DimResultsElement.dim"; //$NON-NLS-1$
-    static final String P_ID_COUNT = "DimResultsElement.count"; //$NON-NLS-1$
-    static final String P_ID_AVERAGE = "DimResultsElement.average"; //$NON-NLS-1$
-    static final String P_ID_STDDEV = "DimResultsElement.stddev"; //$NON-NLS-1$
-    static final String P_ID_ERROR= "DimResultsElement.error"; //$NON-NLS-1$
-    static final String P_ID_HAD_VALUES = "DimResultsElement.hadvalues"; //$NON-NLS-1$
-
-    static final String P_STR_DIMENSION = "dimension"; //$NON-NLS-1$
-    static final String P_STR_COUNT= "count"; //$NON-NLS-1$
-    static final String P_STR_AVERAGE = "average"; //$NON-NLS-1$
-    static final String P_STR_STDDEV = "std dev"; //$NON-NLS-1$
-    static final String P_STR_ERROR = "error"; //$NON-NLS-1$
-    static final String P_STR_HAD_VALUES = "had values"; //$NON-NLS-1$
-
-	private static final TextPropertyDescriptor DIMENSION_DESCRIPTOR = new TextPropertyDescriptor(P_ID_DIMENSION, P_STR_DIMENSION);
-	private static final PropertyDescriptor DIM_COUNT_DESCRIPTOR = new PropertyDescriptor(P_ID_COUNT, P_STR_COUNT);
-	private static final PropertyDescriptor DIM_AVERAGE_DESCRIPTOR = new PropertyDescriptor(P_ID_AVERAGE, P_STR_AVERAGE);
-	private static final PropertyDescriptor DIM_STDDEV_DESCRIPTOR = new PropertyDescriptor(P_ID_STDDEV, P_STR_STDDEV);
-	private static final PropertyDescriptor DIM_ERROR_DESCRIPTOR = new PropertyDescriptor(P_ID_ERROR, P_STR_ERROR);
-	private static final PropertyDescriptor DIM_HAD_VALUES_DESCRIPTOR = new PropertyDescriptor(P_ID_HAD_VALUES, P_STR_HAD_VALUES);
-
-    private static Vector<IPropertyDescriptor> DESCRIPTORS;
-    static Vector<IPropertyDescriptor> initDescriptors(int status) {
-        DESCRIPTORS = new Vector<>();
-		// Status category
-		DESCRIPTORS.add(getInfosDescriptor(status));
-		DESCRIPTORS.add(getWarningsDescriptor(status));
-		DESCRIPTORS.add(ERROR_DESCRIPTOR);
-		ERROR_DESCRIPTOR.setCategory("Status");
-		// Results category
-        DESCRIPTORS.addElement(DIMENSION_DESCRIPTOR);
-		DIMENSION_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.addElement(DIM_COUNT_DESCRIPTOR);
-		DIM_COUNT_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.addElement(DIM_AVERAGE_DESCRIPTOR);
-		DIM_AVERAGE_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.addElement(DIM_STDDEV_DESCRIPTOR);
-		DIM_STDDEV_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.addElement(DIM_ERROR_DESCRIPTOR);
-		DIM_ERROR_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.addElement(DIM_HAD_VALUES_DESCRIPTOR);
-		DIM_HAD_VALUES_DESCRIPTOR.setCategory("Results");
-		// Survey category
-		DESCRIPTORS.add(COMMENT_DESCRIPTOR);
-		COMMENT_DESCRIPTOR.setCategory("Survey");
-        return DESCRIPTORS;
-   	}
-    static Vector<IPropertyDescriptor> getDescriptors() {
-    	return DESCRIPTORS;
-	}
-
-public DimResultsElement(AbstractResults results, ResultsElement parent, Dim d) {
-	super(results, parent);
-	this.dim = d;
-}
-
-@Override
-ResultsElement createChild(AbstractResults testResults) {
-	return null;
-}
-
-private BuildResults getBuildResults() {
-	return (BuildResults) this.results;
-}
-
-@Override
-public String getLabel(Object o) {
-	return this.dim.getName();
-}
-
-@Override
-public IPropertyDescriptor[] getPropertyDescriptors() {
-	Vector<IPropertyDescriptor> descriptors = getDescriptors();
-	if (descriptors == null) {
-		descriptors = initDescriptors(getStatus());
-	}
-	int size = descriptors.size();
-	IPropertyDescriptor[] descriptorsArray = new IPropertyDescriptor[size];
-	descriptorsArray[0] = getInfosDescriptor(getStatus());
-	descriptorsArray[1] = getWarningsDescriptor(getStatus());
-	for (int i=2; i<size; i++) {
-		descriptorsArray[i] = descriptors.get(i);
-	}
-	return descriptorsArray;
-}
-
-@Override
-public Object getPropertyValue(Object propKey) {
-	BuildResults buildResults = getBuildResults();
-    if (propKey.equals(P_ID_DIMENSION)) {
-    	return  this.dim.getDescription();
-    }
-    if (propKey.equals(P_ID_COUNT)) {
-	    long count = buildResults.getCount(this.dim.getId());
-	    return Double.valueOf(count);
-    }
-    if (propKey.equals(P_ID_AVERAGE))
-        return Double.valueOf(buildResults.getValue(this.dim.getId()));
-    if (propKey.equals(P_ID_STDDEV))
-        return Double.valueOf(buildResults.getDeviation(this.dim.getId()));
-    if (propKey.equals(P_ID_ERROR))
-        return Double.valueOf(buildResults.getError(this.dim.getId()));
-    if (propKey.equals(P_ID_HAD_VALUES))
-        return Boolean.valueOf(buildResults.hadValues());
-    return super.getPropertyValue(propKey);
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/PerformanceResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/PerformanceResultsElement.java
deleted file mode 100644
index fd76187..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/PerformanceResultsElement.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test.internal.performance.results.model;
-
-import java.io.BufferedOutputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.Arrays;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.test.internal.performance.results.db.AbstractResults;
-import org.eclipse.test.internal.performance.results.db.DB_Results;
-import org.eclipse.test.internal.performance.results.db.PerformanceResults;
-import org.eclipse.test.internal.performance.results.ui.BuildsComparisonTable;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-import org.eclipse.test.performance.ui.Utils;
-
-public class PerformanceResultsElement extends ResultsElement {
-
-// Singleton pattern
-public static PerformanceResultsElement PERF_RESULTS_MODEL = new PerformanceResultsElement();
-
-	String[] buildNames;
-	String lastBuildName;
-	boolean fingerprints = true;
-
-public PerformanceResultsElement() {
-}
-
-@Override
-ResultsElement createChild(AbstractResults testResults) {
-	return new ComponentResultsElement(testResults, this);
-}
-
-public String[] getBaselines() {
-	getBuildNames();
-	if (this.buildNames == null) {
-		return new String[0];
-	}
-	int length = this.buildNames.length;
-	String[] baselines = new String[length];
-	int count = 0;
-	for (int i=0; i<length; i++) {
-		if (this.buildNames[i].startsWith("R-")) {
-			baselines[count++] = this.buildNames[i];
-		}
-	}
-	if (count < length) {
-		System.arraycopy(baselines, 0, baselines = new String [count], 0, count);
-	}
-	return baselines;
-}
-
-public String[] getBuildNames() {
-	if (this.buildNames == null) {
-		this.buildNames = DB_Results.DB_CONNECTION
-			? DB_Results.getBuilds()
-			: this.results == null
-				? new String[0]
-				: getPerformanceResults().getAllBuildNames();
-	}
-	return this.buildNames;
-}
-
-public Object[] getBuilds() {
-	getBuildNames();
-	int length = this.buildNames == null ? 0 : this.buildNames.length;
-	BuildResultsElement[] elements = new BuildResultsElement[length];
-	for (int i=0; i<length; i++) {
-		elements[i] = new BuildResultsElement(this.buildNames[i], this);
-	}
-	return elements;
-}
-
-public String[] getComponents() {
-	if (!isInitialized()) {
-		String[] components = DB_Results.getComponents();
-		int length = components.length;
-		if (length == 0) {
-			DB_Results.queryAllScenarios();
-			components = DB_Results.getComponents();
-		}
-		return components;
-	}
-	return getPerformanceResults().getComponents();
-}
-
-/**
- * Returns the names of the configurations.
- *
- * @return An array of String
- */
-public String[] getConfigs() {
-	if (!isInitialized()) {
-		String[] configs = DB_Results.getConfigs();
-		int length = configs.length;
-		if (length == 0) {
-			DB_Results.queryAllScenarios();
-			configs = DB_Results.getConfigs();
-		}
-		return configs;
-	}
-	return getPerformanceResults().getConfigNames(false);
-}
-
-/**
- * Returns the descriptions of the configurations.
- *
- * @return An array of String
- */
-public String[] getConfigDescriptions() {
-	if (!isInitialized()) {
-		String[] descriptions = DB_Results.getConfigDescriptions();
-		int length = descriptions.length;
-		if (length == 0) {
-			DB_Results.queryAllScenarios();
-			descriptions = DB_Results.getConfigDescriptions();
-		}
-		return descriptions;
-	}
-	return getPerformanceResults().getConfigBoxes(false);
-}
-
-public Object[] getElements() {
-	if (!isInitialized()) {
-		String[] components = getComponents();
-		int length = components.length;
-		ComponentResultsElement[] elements = new ComponentResultsElement[length];
-		for (int i=0; i<length; i++) {
-			elements[i] = new ComponentResultsElement(components[i], this);
-		}
-		return elements;
-	}
-	return getChildren(null);
-}
-
-public PerformanceResults getPerformanceResults() {
-	return (PerformanceResults) this.results;
-}
-
-boolean hasRead(BuildResultsElement buildResultsElement) {
-	String[] builds = this.results == null ? getBuildNames() : getPerformanceResults().getAllBuildNames();
-	if (Arrays.binarySearch(builds, buildResultsElement.getName(), Util.BUILD_DATE_COMPARATOR) < 0) {
-		return false;
-	}
-	return true;
-}
-
-@Override
-public boolean isInitialized() {
-	return super.isInitialized() && this.results.size() > 0;
-}
-
-public void readLocal(File dataDir, IProgressMonitor monitor, String lastBuild) {
-	reset(lastBuild);
-	PerformanceResults performanceResults = getPerformanceResults();
-	performanceResults.setLastBuildName(lastBuild);
-	performanceResults.readLocal(dataDir, monitor);
-}
-
-public void reset(String buildName) {
-	if (buildName == null) {
-		this.results = new PerformanceResults(this.lastBuildName, null, null, System.out);
-	} else {
-		this.results = new PerformanceResults(buildName, null, null, System.out);
-	}
-	this.children = null;
-	this.buildNames = null;
-}
-
-public void resetBuildNames() {
-	this.buildNames = null;
-}
-
-public void updateBuild(String buildName, boolean force, File dataDir, IProgressMonitor monitor) {
-	if (this.results == null) {
-		reset(buildName);
-	}
-	getPerformanceResults().updateBuild(buildName, force, dataDir, monitor);
-}
-
-public void updateBuilds(String[] builds, boolean force, File dataDir, IProgressMonitor monitor) {
-	if (this.results == null) {
-		reset(null);
-	}
-	getPerformanceResults().updateBuilds(builds, force, dataDir, monitor);
-}
-
-/**
- * Set whether only fingerprints should be taken into account or not.
- *
- * @param fingerprints
- */
-public void setFingerprints(boolean fingerprints) {
-	this.fingerprints = fingerprints;
-	resetStatus();
-}
-
-public void setLastBuildName(String lastBuildName) {
-	this.lastBuildName = lastBuildName;
-	this.name = null;
-}
-
-/*
- * Write the component status in the given file
- */
-public StringBuilder writeFailures(File resultsFile, int kind) {
-	if (this.results == null) {
-		return null;
-	}
-	boolean values = (kind & IPerformancesConstants.STATUS_VALUES) != 0;
-	// Write status only for component with error
-	StringBuilder excluded = new StringBuilder();
-  try (DataOutputStream stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(resultsFile)))) {
-    StringBuilder buffer = new StringBuilder();
-    // Print build name
-    buffer.append("Status for ");
-    buffer.append(getPerformanceResults().getName());
-    buffer.append(Util.LINE_SEPARATOR);
-    // Print status options
-    if ((kind & ~IPerformancesConstants.STATUS_VALUES) > 0) {
-      buffer.append("Options: ");
-      buffer.append(Util.LINE_SEPARATOR);
-      final int errorLevel = kind & IPerformancesConstants.STATUS_ERROR_LEVEL_MASK;
-      if (errorLevel != 0) {
-        buffer.append("	error level: ");
-        switch (errorLevel) {
-          case IPerformancesConstants.STATUS_ERROR_NONE:
-            buffer.append("include all failures whatever the error level is");
-            break;
-          case IPerformancesConstants.STATUS_ERROR_NOTICEABLE:
-            buffer.append("all failures with at least a noticeable error (> 3%) are excluded!");
-            break;
-          case IPerformancesConstants.STATUS_ERROR_SUSPICIOUS:
-            buffer.append("all failures with at least a suspicious error (> 25%) are excluded!");
-            break;
-          case IPerformancesConstants.STATUS_ERROR_WEIRD:
-            buffer.append("all failures with at least a weird error (> 50%) are excluded!");
-            break;
-          case IPerformancesConstants.STATUS_ERROR_INVALID:
-            buffer.append("all failures with an invalid error (> 100%) are excluded!");
-            break;
-        }
-        buffer.append(Util.LINE_SEPARATOR);
-      }
-      final int smallValue = kind & IPerformancesConstants.STATUS_SMALL_VALUE_MASK;
-      if (smallValue > 0) {
-        buffer.append("	small value: ");
-        switch (smallValue) {
-          case IPerformancesConstants.STATUS_SMALL_VALUE_BUILD:
-            buffer.append("all failures with a small build value (<100ms) are excluded!");
-            break;
-          case IPerformancesConstants.STATUS_SMALL_VALUE_DELTA:
-            buffer.append("all failures with a small delta value (<100ms) are excluded!");
-            break;
-          case IPerformancesConstants.STATUS_SMALL_VALUE_MASK:
-            buffer.append("all failures with a small build or delta value (<100ms) are excluded!");
-            break;
-        }
-        buffer.append(Util.LINE_SEPARATOR);
-      }
-      final int stats = kind & IPerformancesConstants.STATUS_STATISTICS_MASK;
-      if (stats > 0) {
-        buffer.append("	statistics: ");
-        switch (stats) {
-          case IPerformancesConstants.STATUS_STATISTICS_ERRATIC:
-            buffer.append("all failures with erratic baseline results (variation > 20%) are excluded!");
-            break;
-          case IPerformancesConstants.STATUS_STATISTICS_UNSTABLE:
-            buffer.append("all failures with unstable baseline results (10% < variation < 20%) are excluded!");
-            break;
-        }
-        buffer.append(Util.LINE_SEPARATOR);
-      }
-      int buildsNumber = kind & IPerformancesConstants.STATUS_BUILDS_NUMBER_MASK;
-      buffer.append("	builds to confirm a regression: ");
-      buffer.append(buildsNumber);
-      buffer.append(Util.LINE_SEPARATOR);
-    }
-    // Print columns title
-    buffer.append("Component");
-    buffer.append("	Scenario");
-    buffer.append("	Machine");
-    if (values) {
-      buffer.append("			Build		");
-      buffer.append("		History		");
-    }
-    buffer.append("	Comment");
-    buffer.append(Util.LINE_SEPARATOR);
-    if (values) {
-      buffer.append("			value");
-      buffer.append("	baseline");
-      buffer.append("	variation");
-      buffer.append("	delta");
-      buffer.append("	error");
-      buffer.append("	n");
-      buffer.append("	mean");
-      buffer.append("	deviation");
-      buffer.append("	coeff");
-      buffer.append(Util.LINE_SEPARATOR);
-    }
-    stream.write(buffer.toString().getBytes());
-    StringBuilder componentBuffer = getFailures(new StringBuilder(), kind, excluded);
-    if (componentBuffer.length() > 0) {
-      stream.write(componentBuffer.toString().getBytes());
-    }
-  } catch (FileNotFoundException e) {
-    System.err.println("Can't create output file" + resultsFile); //$NON-NLS-1$
-  } catch (IOException e) {
-    e.printStackTrace();
-  }
-	return excluded;
-}
-
-/*
- * Write the comparison between two builds in the given file
- */
-public void writeComparison(File resultsFile, String build, String reference) {
-	if (this.results == null) {
-		return;
-	}
-  // Create the stream
-	try (PrintStream stream = new PrintStream(new BufferedOutputStream(new FileOutputStream(resultsFile)))) {
-		// Print main title
-		stream.print("<link href=\""+Utils.TOOLTIP_STYLE+"\" rel=\"stylesheet\" type=\"text/css\">\n");
-		stream.print("<script src=\""+Utils.TOOLTIP_SCRIPT+"\"></script>\n");
-		stream.print("<script src=\""+Utils.FINGERPRINT_SCRIPT+"\"></script>\n");
-		stream.print(Utils.HTML_DEFAULT_CSS);
-		stream.print("<body>");
-		stream.print("<h2>Performance comparison of ");
-		stream.print(build);
-		stream.print(" relative to ");
-		int index = reference.indexOf('-');
-		if (index > 0) {
-			stream.print(reference.substring(0, index));
-			stream.print(" (");
-			index = reference.lastIndexOf('-');
-			stream.print(reference.substring(index+1, reference.length()));
-			stream.print(')');
-		} else {
-			stream.print(reference);
-		}
-		stream.print("</h2>\n");
-
-		// Print a comparison table for each component
-		try {
-			int length = this.children.length;
-			for (int i=0; i<length; i++) {
-				BuildsComparisonTable table = new BuildsComparisonTable(this.children[i].getName(), stream, build, reference);
-				table.print(getPerformanceResults());
-			}
-		} finally {
-      stream.print("</body>");
-    }
-	} catch (FileNotFoundException e) {
-		System.err.println("Can't create output file"+resultsFile); //$NON-NLS-1$
-	}
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ResultsElement.java
deleted file mode 100644
index ecf90b8..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ResultsElement.java
+++ /dev/null
@@ -1,577 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test.internal.performance.results.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.test.internal.performance.eval.StatisticsUtil;
-import org.eclipse.test.internal.performance.results.db.AbstractResults;
-import org.eclipse.test.internal.performance.results.db.BuildResults;
-import org.eclipse.test.internal.performance.results.db.ConfigResults;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * An Organization Element
- */
-public abstract class ResultsElement implements IAdaptable, IPropertySource, IWorkbenchAdapter, Comparable<ResultsElement> {
-
-	// Image descriptors
-	private static final ISharedImages WORKBENCH_SHARED_IMAGES = PlatformUI.getWorkbench().getSharedImages();
-	public static final Image ERROR_IMAGE = WORKBENCH_SHARED_IMAGES.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
-	public static final ImageDescriptor ERROR_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_OBJS_ERROR_TSK);
-	public static final Image WARN_IMAGE = WORKBENCH_SHARED_IMAGES.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
-	public static final ImageDescriptor WARN_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_OBJS_WARN_TSK);
-	public static final Image INFO_IMAGE = WORKBENCH_SHARED_IMAGES.getImage(ISharedImages.IMG_OBJS_INFO_TSK);
-	public static final ImageDescriptor INFO_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK);
-	public static final Image HELP_IMAGE = WORKBENCH_SHARED_IMAGES.getImage(ISharedImages.IMG_LCL_LINKTO_HELP);
-	public static final ImageDescriptor HELP_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_LCL_LINKTO_HELP);
-	public static final ImageDescriptor FOLDER_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER);
-	public static final ImageDescriptor CONNECT_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_ELCL_SYNCED);
-
-	// Model
-    ResultsElement parent;
-	AbstractResults results;
-	ResultsElement[] children;
-	String name;
-	int status = -1;
-
-	// Stats
-    double[] statistics;
-
-	// Status constants
-	// state
-	static final int UNKNOWN = 0x01;
-	static final int UNREAD = 0x02;
-	static final int READ = 0x04;
-	static final int MISSING = 0x08;
-	public static final int STATE_MASK = 0x0F;
-	// info
-	static final int SMALL_VALUE = 0x0010;
-	static final int STUDENT_TTEST = 0x0020;
-	public static final int INFO_MASK = 0x0030;
-	// warning
-	static final int NO_BASELINE = 0x0040;
-	static final int SINGLE_RUN = 0x0080;
-	static final int BIG_ERROR = 0x0100;
-	static final int NOT_STABLE = 0x0200;
-	static final int NOT_RELIABLE = 0x0400;
-	public static final int WARNING_MASK = 0x0FC0;
-	// error
-	static final int BIG_DELTA = 0x1000;
-	public static final int ERROR_MASK = 0xF000;
-
-	// Property descriptors
-	static final String P_ID_STATUS_INFO = "ResultsElement.status_info"; //$NON-NLS-1$
-	static final String P_ID_STATUS_WARNING = "ResultsElement.status_warning"; //$NON-NLS-1$
-	static final String P_ID_STATUS_ERROR = "ResultsElement.status_error"; //$NON-NLS-1$
-	static final String P_ID_STATUS_COMMENT = "ResultsElement.status_comment"; //$NON-NLS-1$
-
-	static final String P_STR_STATUS_INFO = " info"; //$NON-NLS-1$
-	static final String P_STR_STATUS_WARNING = "warning"; //$NON-NLS-1$
-	static final String P_STR_STATUS_ERROR = "error"; //$NON-NLS-1$
-	static final String P_STR_STATUS_COMMENT = "comment"; //$NON-NLS-1$
-	static final String[] NO_VALUES = new String[0];
-
-	private static Vector<IPropertyDescriptor> DESCRIPTORS;
-	static final TextPropertyDescriptor COMMENT_DESCRIPTOR = new TextPropertyDescriptor(P_ID_STATUS_COMMENT, P_STR_STATUS_COMMENT);
-	static final TextPropertyDescriptor ERROR_DESCRIPTOR = new TextPropertyDescriptor(P_ID_STATUS_ERROR, P_STR_STATUS_ERROR);
-    static Vector<IPropertyDescriptor> initDescriptors(int status) {
-		DESCRIPTORS = new Vector<>();
-		// Status category
-		DESCRIPTORS.add(getInfosDescriptor(status));
-		DESCRIPTORS.add(getWarningsDescriptor(status));
-		DESCRIPTORS.add(ERROR_DESCRIPTOR);
-		ERROR_DESCRIPTOR.setCategory("Status");
-		// Survey category
-		DESCRIPTORS.add(COMMENT_DESCRIPTOR);
-		COMMENT_DESCRIPTOR.setCategory("Survey");
-		return DESCRIPTORS;
-	}
-    static Vector<IPropertyDescriptor> getDescriptors() {
-    	return DESCRIPTORS;
-	}
-    static ComboBoxPropertyDescriptor getInfosDescriptor(int status) {
-		List<String> list = new ArrayList<>();
-		if ((status & SMALL_VALUE) != 0) {
-			list.add("Some builds have tests with small values");
-		}
-		if ((status & STUDENT_TTEST) != 0) {
-			list.add("Some builds have student-t test error over the threshold");
-		}
-		String[] infos = new String[list.size()];
-		if (list.size() > 0) {
-			list.toArray(infos);
-		}
-		ComboBoxPropertyDescriptor infoDescriptor = new ComboBoxPropertyDescriptor(P_ID_STATUS_INFO, P_STR_STATUS_INFO, infos);
-		infoDescriptor.setCategory("Status");
-		return infoDescriptor;
-	}
-    static PropertyDescriptor getWarningsDescriptor(int status) {
-		List<String> list = new ArrayList<>();
-		if ((status & BIG_ERROR) != 0) {
-			list.add("Some builds have tests with error over 3%");
-		}
-		if ((status & NOT_RELIABLE) != 0) {
-			list.add("Some builds have no reliable tests");
-		}
-		if ((status & NOT_STABLE) != 0) {
-			list.add("Some builds have no stable tests");
-		}
-		if ((status & NO_BASELINE) != 0) {
-			list.add("Some builds have no baseline to compare with");
-		}
-		if ((status & SINGLE_RUN) != 0) {
-			list.add("Some builds have single run tests");
-		}
-		String[] warnings = new String[list.size()];
-		if (list.size() > 0) {
-			list.toArray(warnings);
-		}
-		ComboBoxPropertyDescriptor warningDescriptor = new ComboBoxPropertyDescriptor(P_ID_STATUS_WARNING, P_STR_STATUS_WARNING, warnings);
-		warningDescriptor.setCategory("Status");
-		return warningDescriptor;
-	}
-
-ResultsElement() {
-}
-
-ResultsElement(AbstractResults results, ResultsElement parent) {
-    this.parent = parent;
-    this.results = results;
-}
-
-ResultsElement(String name, ResultsElement parent) {
-	this.parent = parent;
-	this.name = name;
-}
-
-@Override
-public int compareTo(ResultsElement o) {
-	if (this.results == null) {
-		if (o != null && this.name != null) {
-			ResultsElement element = o;
-			return this.name.compareTo(element.getName());
-		}
-		return -1;
-	}
-	if (o != null) {
-		return this.results.compareTo(o.results);
-	}
-	return -1;
-}
-
-abstract ResultsElement createChild(AbstractResults testResults);
-
-@Override
-public <T> T getAdapter(Class<T> adapter) {
-    if (adapter == IPropertySource.class) {
-        return adapter.cast(this);
-    }
-    if (adapter == IWorkbenchAdapter.class) {
-        return adapter.cast(this);
-    }
-    return null;
-}
-
-/**
- * Iterate the element children.
- */
-public ResultsElement[] getChildren() {
-	if (this.results == null) {
-		return new ResultsElement[0];
-	}
-	if (this.children == null) {
-		initChildren();
-	}
-    return this.children;
-}
-
-@Override
-public Object[] getChildren(Object o) {
-	if (this.results == null) {
-		return new Object[0];
-	}
-	if (this.children == null) {
-		initChildren();
-	}
-    return this.children;
-}
-
-@Override
-public Object getEditableValue() {
-    return this;
-}
-
-final String getId() {
-	return getId(new StringBuilder()).toString();
-}
-
-private StringBuilder getId(StringBuilder buffer) {
-	if (this.parent != null) {
-		return this.parent.getId(buffer).append('/').append(getName());
-	}
-	return buffer;
-}
-
-@Override
-public ImageDescriptor getImageDescriptor(Object object) {
-	if (object instanceof ResultsElement) {
-		ResultsElement resultsElement = (ResultsElement) object;
-// DEBUG
-//		if (resultsElement.getName().equals("I20090806-0100")) {
-//			if (resultsElement.results != null) {
-//				String toString = resultsElement.results.getParent().toString();
-//				String toString = resultsElement.results.toString();
-//				if (toString.indexOf("testStoreExists")>0 && toString.indexOf("eplnx2")>0) {
-//					System.out.println("stop");
-//				}
-//			}
-//		}
-		int elementStatus = resultsElement.getStatus();
-		if (elementStatus == MISSING) {
-			return HELP_IMAGE_DESCRIPTOR;
-		}
-		if ((elementStatus & ResultsElement.ERROR_MASK) != 0) {
-			return ERROR_IMAGE_DESCRIPTOR;
-		}
-		if ((elementStatus & ResultsElement.WARNING_MASK) != 0) {
-			return WARN_IMAGE_DESCRIPTOR;
-		}
-		if ((elementStatus & ResultsElement.INFO_MASK) != 0) {
-			return INFO_IMAGE_DESCRIPTOR;
-		}
-	}
-	return null;
-}
-
-@Override
-public String getLabel(Object o) {
-    return getName();
-}
-
-/**
- * Returns the name
- */
-public String getName() {
-	if (this.name == null && this.results != null) {
-		this.name = this.results.getName();
-	}
-	return this.name;
-}
-
-/**
- * Returns the parent
- */
-@Override
-public Object getParent(Object o) {
-    return this.parent;
-}
-
-@Override
-public IPropertyDescriptor[] getPropertyDescriptors() {
-	Vector<IPropertyDescriptor> descriptors = getDescriptors();
-	if (descriptors == null) {
-		descriptors = initDescriptors(getStatus());
-	}
-	int size = descriptors.size();
-	IPropertyDescriptor[] descriptorsArray = new IPropertyDescriptor[size];
-	descriptorsArray[0] = getInfosDescriptor(getStatus());
-	descriptorsArray[1] = getWarningsDescriptor(getStatus());
-	for (int i=2; i<size; i++) {
-		descriptorsArray[i] = descriptors.get(i);
-	}
-	return descriptorsArray;
-}
-
-@Override
-public Object getPropertyValue(Object propKey) {
-	if (propKey.equals(P_ID_STATUS_INFO)) {
-		if ((getStatus() & INFO_MASK) != 0) {
-			return Integer.valueOf(0);
-		}
-	}
-	if (propKey.equals(P_ID_STATUS_WARNING)) {
-		if ((getStatus() & WARNING_MASK) != 0) {
-			return Integer.valueOf(0);
-		}
-	}
-	if (propKey.equals(P_ID_STATUS_ERROR)) {
-		if ((getStatus() & BIG_DELTA) != 0) {
-			return "Some builds have tests with regression";
-		}
-	}
-	if (propKey.equals(P_ID_STATUS_COMMENT)) {
-		IEclipsePreferences preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-		return preferences.get(getId(), "");
-	}
-	return null;
-}
-
-public ResultsElement getResultsElement(String resultName) {
-	int length = getChildren(null).length;
-	for (int i=0; i<length; i++) {
-		ResultsElement searchedResults = this.children[i];
-		if (searchedResults.getName().equals(resultName)) {
-			return searchedResults;
-		}
-	}
-	return null;
-}
-
-/**
- * Return the status of the element.
- *
- * The status is a bit mask pattern where digits are
- * allowed as follow:
- *	<ul>
- * 		<li>0-3: bits for state showing whether the element is
- * 			<ul>
- * 				<li>{@link #UNKNOWN} : not connected to a db</li>
- * 				<li>{@link #UNREAD} : is not valid (e.g. NaN results)</li>
- * 				<li>{@link #MISSING} : no results (e.g. the perf machine crashed and didn't store any results)</li>
- * 				<li>{@link #READ} : has valid results</li>
- * 			</ul>
- * 		</li>
- * 		<li>4-5: bits for information. Current possible information are
- * 			<ul>
- * 				<li>{@link #SMALL_VALUE} : build results or delta with baseline value is under 100ms</li>
- * 				<li>{@link #STUDENT_TTEST} : the Student T-test is over the threshold (old yellow color for test results)</li>
- * 			</ul>
- * 		</li>
- * 		<li>6-11: bits for warnings. Current possible warnings are
- * 			<ul>
- * 				<li>{@link #NO_BASELINE} : no baseline for the current build</li>
- * 				<li>{@link #SINGLE_RUN} : the test has only one run (i.e. no error could be computed), hence its reliability cannot be evaluated</li>
- * 				<li>{@link #BIG_ERROR} : the test result is over the 3% threshold</li>
- * 				<li>{@link #NOT_STABLE} : the test history shows a deviation between 10% and 20% (may mean that this test is not so reliable)</li>
- * 				<li>{@link #NOT_RELIABLE} : the test history shows a deviation over 20% (surely means that this test is too erratic to be reliable)</li>
- * 			</ul>
- * 		</li>
- * 		<li>12-15: bits for errors. Current possible errors are
- * 			<ul>
- * 				<li>{@link #BIG_DELTA} : the delta for the test is over the 10% threshold</li>
- * 			</ul>
- * 		</li>
- *	</ul>
- *
- * Note that these explanation applied to {@link BuildResultsElement}, and {@link DimResultsElement}.
- * For {@link ComponentResultsElement}, and {@link ScenarioResultsElement}, it's the merge of all the children status
- * and means "Some tests have..." instead of "The test has...". For {@link ConfigResultsElement}, it means the status
- * of the most recent build compared to its most recent baseline.
- *
- * @return An int with each bit set when the corresponding symptom applies.
- */
-public final int getStatus() {
-	if (this.status < 0) {
-		initStatus();
-	}
-	return this.status;
-}
-
-/**
- * Return the statistics of the build along its history.
- *
- * @return An array of double built as follows:
- * <ul>
- * <li>0:	numbers of values</li>
- * <li>1:	mean of values</li>
- * <li>2:	standard deviation of these values</li>
- * <li>3:	coefficient of variation of these values</li>
- * </ul>
- */
-double[] getStatistics() {
-	return this.statistics;
-}
-
-/**
- * Returns whether the element (or one in its hierarchy) has an error.
- *
- * @return <code> true</code> if the element or one in its hierarchy has an error,
- * 	<code> false</code>  otherwise
- */
-public final boolean hasError() {
-	return (getStatus() & ERROR_MASK) != 0;
-}
-
-void initChildren() {
-	AbstractResults[] resultsChildren = this.results.getChildren();
-	int length = resultsChildren.length;
-	this.children = new ResultsElement[length];
-	int count = 0;
-	for (int i=0; i<length; i++) {
-		ResultsElement childElement = createChild(resultsChildren[i]);
-		if (childElement != null) {
-			this.children[count++] = childElement;
-		}
-	}
-	if (count < length) {
-		System.arraycopy(this.children, 0, this.children = new ResultsElement[count], 0, count);
-	}
-}
-void initStatus() {
-	this.status = READ;
-	if (this.results != null) {
-		if (this.children == null) initChildren();
-		int length = this.children.length;
-		for (int i=0; i<length; i++) {
-			this.status |= this.children[i].getStatus();
-		}
-	}
-}
-
-int initStatus(BuildResults buildResults) {
-	this.status = READ;
-
-	// Get values
-	double buildValue = buildResults.getValue();
-	ConfigResults configResults = (ConfigResults) buildResults.getParent();
-	BuildResults baselineResults = configResults.getBaselineBuildResults(buildResults.getName());
-	double baselineValue = baselineResults.getValue();
-	double delta = (baselineValue - buildValue) / baselineValue;
-
-	// Store if there's no baseline
-	if (Double.isNaN(delta)) {
-		this.status |= NO_BASELINE;
-	}
-
-	// Store if there's only one run
-	long baselineCount = baselineResults.getCount();
-	long currentCount = buildResults.getCount();
-	double error = Double.NaN;
-	if (baselineCount == 1 || currentCount == 1) {
-		this.status |= SINGLE_RUN;
-	}
-
-	// Store if the T-test is not good
-	double ttestValue = Util.computeTTest(baselineResults, buildResults);
-	int degreeOfFreedom = (int) (baselineResults.getCount()+buildResults.getCount()-2);
-	if (ttestValue >= 0 && StatisticsUtil.getStudentsT(degreeOfFreedom, StatisticsUtil.T90) >= ttestValue) {
-		this.status |= STUDENT_TTEST;
-	}
-
-	// Store if there's a big error (over 3%)
-	double baselineError = baselineResults.getError();
-	double currentError = buildResults.getError();
-	error = Double.isNaN(baselineError)
-			? currentError / baselineValue
-			: Math.sqrt(baselineError*baselineError + currentError*currentError) / baselineValue;
-	if (error > 0.03) {
-		this.status |= BIG_ERROR;
-	}
-
-	// Store if there's a big delta (over 10%)
-	if (delta <= -0.1) {
-		this.status |= BIG_DELTA;
-		double currentBuildValue = buildResults.getValue();
-		double diff = Math.abs(baselineValue - currentBuildValue);
-		if (currentBuildValue < 100 || diff < 100) { // moderate the status when
-			// diff is less than 100ms
-			this.status |= SMALL_VALUE;
-		} else {
-			double[] stats = getStatistics();
-			if (stats != null) {
-				if (stats[3] > 0.2) { // invalidate the status when the test
-					// historical deviation is over 20%
-					this.status |= NOT_RELIABLE;
-				} else if (stats[3] > 0.1) { // moderate the status when the test
-					// historical deviation is between 10%
-					// and 20%
-					this.status |= NOT_STABLE;
-				}
-			}
-		}
-	}
-
-	return this.status;
-}
-
-public boolean isInitialized() {
-	return this.results != null;
-}
-
-@Override
-public boolean isPropertySet(Object property) {
-    return false;
-}
-
-boolean onlyFingerprints() {
-	if (this.parent != null) {
-		return this.parent.onlyFingerprints();
-	}
-	return ((PerformanceResultsElement)this).fingerprints;
-}
-
-@Override
-public void resetPropertyValue(Object property) {
-}
-
-void resetStatus() {
-	this.status = -1;
-	if (this.results != null) {
-		if (this.children == null) initChildren();
-		int length = this.children.length;
-		for (int i=0; i<length; i++) {
-			this.children[i].resetStatus();
-		}
-	}
-}
-
-@Override
-public void setPropertyValue(Object name, Object value) {
-	if (name.equals(P_ID_STATUS_COMMENT)) {
-		IEclipsePreferences preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-		preferences.put(getId(), (String) value);
-		try {
-			preferences.flush();
-		} catch (BackingStoreException e) {
-			// skip
-		}
-	}
-}
-
-@Override
-public String toString() {
-	if (this.results == null) {
-		return getName();
-	}
-	return this.results.toString();
-}
-
-/*
- * Write the failures of the element in the given buffer
- */
-StringBuilder getFailures(StringBuilder buffer, int kind, StringBuilder excluded) {
-	int length = getChildren().length;
-	for (int i=0; i<length; i++) {
-		this.children[i].getFailures(buffer, kind, excluded);
-	}
-	return buffer;
-}
-
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ScenarioResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ScenarioResultsElement.java
deleted file mode 100644
index 717257e..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ScenarioResultsElement.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test.internal.performance.results.model;
-
-import java.util.Vector;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.test.internal.performance.results.db.AbstractResults;
-import org.eclipse.test.internal.performance.results.db.ScenarioResults;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-public class ScenarioResultsElement extends ResultsElement {
-
-	// Property descriptors
-    static final String P_ID_SCENARIO_LABEL = "ScenarioResultsElement.label"; //$NON-NLS-1$
-    static final String P_ID_SCENARIO_FILE_NAME = "ScenarioResultsElement.filename"; //$NON-NLS-1$
-    static final String P_ID_SCENARIO_SHORT_NAME = "ScenarioResultsElement.shortname"; //$NON-NLS-1$
-
-    static final String P_STR_SCENARIO_LABEL = "label"; //$NON-NLS-1$
-    static final String P_STR_SCENARIO_FILE_NAME = "file name"; //$NON-NLS-1$
-    static final String P_STR_SCENARIO_SHORT_NAME = "short name"; //$NON-NLS-1$
-
-    private static final TextPropertyDescriptor SCENARIO_LABEL_DESCRIPTOR = new TextPropertyDescriptor(P_ID_SCENARIO_LABEL, P_STR_SCENARIO_LABEL);
-	private static final TextPropertyDescriptor SCENARIO_FILE_NAME_DESCRIPTOR = new TextPropertyDescriptor(P_ID_SCENARIO_FILE_NAME, P_STR_SCENARIO_FILE_NAME);
-	private static final TextPropertyDescriptor SCENARIO_SHORT_NAME_DESCRIPTOR = new TextPropertyDescriptor(P_ID_SCENARIO_SHORT_NAME, P_STR_SCENARIO_SHORT_NAME);
-
-    private static Vector<IPropertyDescriptor> DESCRIPTORS;
-    static Vector<IPropertyDescriptor> initDescriptors(int status) {
-        DESCRIPTORS = new Vector<>();
-		// Status category
-		DESCRIPTORS.add(getInfosDescriptor(status));
-		DESCRIPTORS.add(getWarningsDescriptor(status));
-		DESCRIPTORS.add(ERROR_DESCRIPTOR);
-		ERROR_DESCRIPTOR.setCategory("Status");
-		// Results category
-        DESCRIPTORS.addElement(SCENARIO_LABEL_DESCRIPTOR);
-		SCENARIO_LABEL_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.addElement(SCENARIO_FILE_NAME_DESCRIPTOR);
-		SCENARIO_FILE_NAME_DESCRIPTOR.setCategory("Results");
-        DESCRIPTORS.addElement(SCENARIO_SHORT_NAME_DESCRIPTOR);
-		SCENARIO_SHORT_NAME_DESCRIPTOR.setCategory("Results");
-		// Survey category
-		DESCRIPTORS.add(COMMENT_DESCRIPTOR);
-		COMMENT_DESCRIPTOR.setCategory("Survey");
-        return DESCRIPTORS;
-	}
-    static Vector<IPropertyDescriptor> getDescriptors() {
-    	return DESCRIPTORS;
-	}
-
-ScenarioResultsElement(AbstractResults results, ResultsElement parent) {
-    super(results, parent);
-}
-
-@Override
-ResultsElement createChild(AbstractResults testResults) {
-	return new ConfigResultsElement(testResults, this);
-}
-
-@Override
-public String getLabel(Object o) {
-	return ((ScenarioResults) this.results).getShortName();
-}
-
-@Override
-public IPropertyDescriptor[] getPropertyDescriptors() {
-	Vector<IPropertyDescriptor> descriptors = getDescriptors();
-	if (descriptors == null) {
-		descriptors = initDescriptors(getStatus());
-	}
-	int size = descriptors.size();
-	IPropertyDescriptor[] descriptorsArray = new IPropertyDescriptor[size];
-	descriptorsArray[0] = getInfosDescriptor(getStatus());
-	descriptorsArray[1] = getWarningsDescriptor(getStatus());
-	for (int i=2; i<size; i++) {
-		descriptorsArray[i] = descriptors.get(i);
-	}
-	return descriptorsArray;
-}
-
-@Override
-public Object getPropertyValue(Object propKey) {
-	ScenarioResults scenarioResults = (ScenarioResults) this.results;
-    if (propKey.equals(P_ID_SCENARIO_LABEL))
-        return scenarioResults.getLabel();
-    if (propKey.equals(P_ID_SCENARIO_FILE_NAME))
-        return scenarioResults.getFileName();
-    if (propKey.equals(P_ID_SCENARIO_SHORT_NAME))
-        return scenarioResults.getShortName();
-    return super.getPropertyValue(propKey);
-}
-
-/**
- * Returns whether one of the scenario's config has a summary or not.
- *
- * @return <code>true</code> if one of the scenario's config has a summary
- * 	<code>false</code> otherwise.
- */
-public boolean hasSummary() {
-	if (this.results == null) return false;
-	return ((ScenarioResults)this.results).hasSummary();
-}
-
-@Override
-void initStatus() {
-	if (onlyFingerprints()) {
-		if (hasSummary()) {
-			super.initStatus();
-		} else {
-			this.status = READ;
-		}
-	} else {
-		super.initStatus();
-	}
-}
-
-@Override
-StringBuilder getFailures(StringBuilder buffer, int kind, StringBuilder excluded) {
-	// Write status for scenarios having error
-	if ((getStatus() & ERROR_MASK) != 0) {
-
-		// Get children status
-		StringBuilder childrenBuffer = super.getFailures(new StringBuilder(), kind, excluded);
-
-		// Write status on file if not excluded
-		if (childrenBuffer.length() > 0) {
-			buffer.append("	");
-			buffer.append(getLabel(null));
-			IEclipsePreferences preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-			String comment = preferences.get(getId(), null);
-			if (comment != null) {
-				if ((kind & IPerformancesConstants.STATUS_VALUES) != 0) {
-					buffer.append("											");
-				} else {
-					buffer.append("		");
-				}
-				buffer.append(comment);
-			}
-			buffer.append(Util.LINE_SEPARATOR);
-			buffer.append(childrenBuffer);
-			buffer.append(Util.LINE_SEPARATOR);
-		}
-	}
-	return buffer;
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/UiPlugin.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/UiPlugin.java
index 872eaaa..2f35a7e 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/UiPlugin.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/UiPlugin.java
@@ -11,9 +11,6 @@
 package org.eclipse.test.performance.ui;
 
 import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.preferences.ScopedPreferenceStore;
 import org.osgi.framework.BundleContext;
 
 /**
@@ -22,7 +19,6 @@
 public class UiPlugin extends Plugin {
 	//The shared instance.
 	private static UiPlugin plugin;
-	private IPreferenceStore preferenceStore;
 
 	/**
 	 * The constructor.
@@ -57,12 +53,5 @@
 		return plugin;
 	}
 
-	public IPreferenceStore getPreferenceStore() {
-		if (this.preferenceStore == null) {
-			this.preferenceStore = new ScopedPreferenceStore(InstanceScope.INSTANCE, getBundle().getSymbolicName());
-
-		}
-		return this.preferenceStore;
-	}
 
 }
