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 012312a..2e40a62 100644
--- a/bundles/org.eclipse.test.performance.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.test.performance.ui/META-INF/MANIFEST.MF
@@ -9,13 +9,10 @@
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.swt,
  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.ui.ide;bundle-version="3.5.0";resolution:=optional,
- org.eclipse.core.resources;bundle-version="3.5.0"
+ org.eclipse.ui;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,
diff --git a/bundles/org.eclipse.test.performance.ui/build.properties b/bundles/org.eclipse.test.performance.ui/build.properties
index f0b5824..8519760 100644
--- a/bundles/org.eclipse.test.performance.ui/build.properties
+++ b/bundles/org.eclipse.test.performance.ui/build.properties
@@ -16,19 +16,13 @@
                readme.html,\
                scripts/,\
                icons/,\
-               html/,\
-               toc.xml,\
-               contexts.xml,\
                doc/,\
                plugin.properties,\
                .
 src.includes = about.html,\
-               contexts.xml,\
                doc/,\
-               html/,\
                icons/,\
                images/,\
                readme.html,\
-               toc.xml,\
                scripts/
 source.. = src/
diff --git a/bundles/org.eclipse.test.performance.ui/contexts.xml b/bundles/org.eclipse.test.performance.ui/contexts.xml
deleted file mode 100644
index c205f96..0000000
--- a/bundles/org.eclipse.test.performance.ui/contexts.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<contexts>
- <context id="components" title="Components View">
-    <description>This view shows the performance results in a hierarchical tree:
-Component
-   + Scenario
-      + Test machine
-         + Build
-            + Performance numbers
-
-Typically, the Eclipse builder runs performance tests for each component after the build is made on several performance test machines. Each component defines one or several specific performance test suites made of several test (aka scenario). Several performance numbers (e.g. Elapsed Process Time and CPU Time) are stored for each scenario and all build results are available in the performance results database.
-
-This structure is roughly the same than the one used to generate performance results, hence make it easy to match the numbers in the corresponding page HTML page.</description>
- </context>
- <context id="builds" title="Builds view">
-    <description>This view shows the list of all the builds contained in the connected database or in the local data files if no database is connected.
-
-Different fonts are used to display build names depending on the level of knowledge about the corresponding build:
- - gray+italic: connected to a database but no available local data
- - gray: connected to a database and local data do not contain any information for this build
- - black: local data contain information about this build</description>
- </context>
- <context id="results" title="Component Results view">
-    <description>This view show for each of the performance machine the entire results since the beginning.
-
-Each tab of this view represent a performance machine (also named config).
-The name of the machine is the name of the tab. The results are displayed in
-a table where each column represents a scenario and each line a build.
-The lines are ordered in descending order (from the most recent to the oldest build).</description>
- </context>
-</contexts>
diff --git a/bundles/org.eclipse.test.performance.ui/html/builds-comparison.html b/bundles/org.eclipse.test.performance.ui/html/builds-comparison.html
deleted file mode 100644
index 68770bd..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/builds-comparison.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Builds Comparison view</title>
-</head>
-
-<body>
-<h1>Builds Comparison view</h1>
-<p>
-This view shows the scenarios status table of the difference between two builds
-selected in the <a href="builds.html">Builds view</a>.
-</p><p>
-The comparison between the two builds is shown for each component in a
-separated tab which contains a table made of all scenarios (lines) and all
-configuration (columns).<br>
-<i>Note that this format is similar than the one used to generate performance
-results HTML pages...</i>
-</p>
-
-<h2>Filters</h2>
-<p>
-
-<h3>Scenarios filter</h3>
-<ul>
-<li>Advanced scenarios: hide the scenarios which are not in the fingerprints</li>
-</ul>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/html/builds.html b/bundles/org.eclipse.test.performance.ui/html/builds.html
deleted file mode 100644
index 509c2b5..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/builds.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Builds view</title>
-</head>
-
-<body>
-<h1>Builds view</h1>
-<p>
-This view shows the list of all the builds contained in the connected database
-or in the local data files if no database is connected.
-</p>
-
-<h2>Information status</h2>
-<p>
-When starting the tool for the first time, this view is empty as no data has been
-populated, neither from the <a href="local_data.html">local data</a> files
-nor from the performance results database.
-</p><p>
-The typical usage of the performance tools is to read local data files copied
-from the server (see <a href="local_data.html">local data</a>). When this has
-been done, build names are displayed in this view using normal black color.
-</p>
-Some or all build names of the list may be displayed in a different font when
-a performance results database is connected:
-<ul>
-<li>
-<i><font color="#888888">gray and italic</font></i>: no local data files
-were read
-<p><img src="images/builds-nolocaldata.png" alt="Builds view with no local data"/></p>
-</li>
-<li>
-<i><font color="#888888">gray</font></i>: the local data files were read but contain
-no information about this build (typically new performance tests ran but the local
-data files were not copied since then):
-<p><img src="images/builds-missinglocaldata.png" alt="Builds view with missing local data"/></p>
-In this case it's possible to update those builds using the popup-menu:
-<p><img src="images/builds-update.png" alt="Update local data builds"/></p>
-It's also possible to rewrite the local data files from the database contents
-in one shot using the toolbar pull-up menu:
-<p><img src="images/builds-updateall.png" alt="Update all local data"/></p>
-</li>
-</ul>
-
-<h2>Generate</h2>
-<p>
-From this view, it is also possible to generate HTML pages using the generate
-command accessible from the popup-menu:
-<p><img src="images/builds-generate-menu.png" alt="Generate results: menu item"/></p>
-<p>
-After having selected the directory where to put the generated files, it's possible
-to choose the baseline to compare with:
-<p><img src="images/builds-generate-baseline.png" alt="Generate results: baseline selection"/></p>
-<p>
-And also whether you only want to generate the fingerprints or all the data:
-<p><img src="images/builds-generate-fingerprints.png" alt="Generate results: fingerprints"/></p>
-<p>
-After the generation ends, there should be in the specified directory similar
-files than the one generated on eclipsebuildserv.
-</p><p>
-<i>Note that a PHP server is neeeded to be able to read these files as it's done on
-eclipsebuildserv or fullmoon...</i>
-</p>
-
-<h2><a name="writecomparison">Write comparison</a></h2>
-<p>
-From this view, it is also possible to write the comparison between two 
-selected builds using the <b>Write comparison</b> item of the View menu:
-</p>
-<p><img src="images/write-comparison-menu.png" alt="Write comparison menu item"/></p>
-<p>
-The written HTML file will contain the Scenario Status Table as it would
-have been generated but comparing the two selected build instead of comparing
-a build vs a baseline.
-</p><p>
-This is helpful to see if a regression occurs after having made a change with 
-possible impact performance...
-</p>
-<p>Note that this comparison can also be shown in the
-<a href="builds-comparison.html">Builds Comparison view</a>...
-</p>
-
-<h2>Filters</h2>
-<p>
-There are several possible filters in this view.
- 
-<h3>Builds filters</h3>
-<ul>
-<li>Baseline: hide the baselines (starting with R-3.x)</li>
-<li>Old: hide all builds before last milestone except earlier milestones</li>
-</ul>
-<p>
-In this view baselines filter is not activated by default. It's because it may
-be interesting to know which baselines have results in the DB.
-Note that this filter is not synchronized with the one in Components view.
-</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/html/components.html b/bundles/org.eclipse.test.performance.ui/html/components.html
deleted file mode 100644
index 356bbc7..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/components.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Components view</title>
-</head>
-
-<body>
-<h1>Components view</h1>
-<p>
-This view shows the performance results in similar way than the one used to generate
-the performance results, hence make it easy to match the numbers in the corresponding
-page HTML page.
-</p><p>
-When starting the tool for the first time, this view is empty as no data has been
-populated, neither from the <a href="local_data.html">local data</a> files
-nor from the performance results database.
-</p>
-
-
-<h2>Hierarchical tree</h2>
-<p>
-Typically, the Eclipse builder runs performance tests for each component after
-the build is made on several performance test machines. Each component defines one
-or several specific performance test suites made of several test (aka scenario).
-</p><p>
-Several performance numbers (e.g. Elapsed Process Time and CPU Time) are stored
-for each scenario and all build results are available in the performance results
-database.
-</p><p>
-Hence the tree structure is made as follow:
-<pre>
-Component
-   + Scenario
-      + Test machine
-         + Build
-            + Performance numbers
-</pre>
-and may look as follow:
-<p><img src="images/components.png" alt="Components view"/></p>
-
-<h2>Icons</h2>
-<p>
-Several icons are displayed on tree element, here are their meaning.
-</p><p>
-The red cross means that there's at least one scenario on one machine for
-the last build with a failure (i.e. a regression over 10%).
-</p><p>
-The warning icon means that some warnings occur for some results.
-The current possible warning are:</p>
-<ul>
-<li>error over the 3% threshold on test(s)</li>
-<li>unreliable test(s): the deviation through the test(s) history is over 20%</li>
-<li>unstable test(s): the deviation through the test(s) history is between 10 and 20%</li>
-<li>no baseline for test(s)</li>
-<li>only one run on test(s)</li>
-</ul>
-<p>
-The information icon gives some other interesting information:</p>
-<ul>
-<li>the Student T-test fails on test(s)</li>
-<li>the test(s) value or its delta is less than 100ms</li>
-</ul>
-<p>
-Note that for component and scenario level, the status is the aggregation of
-the children status. That means that as soon as one scenario is in error then
-the component is also flagged in error. And of course the higher severity is
-displayed masking lower possible icons.
-</p>
-
-<h2>Filters</h2>
-<p>
-There are several possible filters in this view:
-
-<h3>Builds filters</h3>
-<ul>
-<li>Baseline: hide the baselines (starting with R-3.x)</li>
-<li>Old: hide all builds before last milestone except earlier milestones</li>
-</ul>
-
-<h3>Scenarios filter</h3>
-<ul>
-<li>Advanced scenarios: hide the scenarios which are not in the fingerprints</li>
-</ul>
-<p>
-As baselines results are not really useful for the survey, the filter is activated
-by default in this view. Currently the survey only concerns the fingerprint
-scenario, hence the corresponding filter is also activated by default.
-</p>
-
-<h2><a name="writestatus">Write status</a></h2>
-<p>
-From this view, it is also possible to write the status file for the last
-active build (see <a href="preferences.html#lastbuild">Last build</a>) by
-using the <b>Write status</b> item of the View menu:
-</p>
-<p><img src="images/write-status-menu.png" alt="Write status menu item"/></p>
-<p>
-The written status file will contain all scenarios which have failures,
-except those excluded by the status preferences set in the preferences page
-(see <a href="preferences.html#status">Status</a>)
-</p><p>
-Then it's easy to see the new regression occurring in a build when comparing
-to the previous build status file:
-</p>
-<p><img src="images/write-status-comparison.png" alt="Compare write status files"/></p>
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-baseline.png b/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-baseline.png
deleted file mode 100644
index 42af1f4..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-baseline.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-fingerprints.png b/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-fingerprints.png
deleted file mode 100644
index 5a746ca..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-fingerprints.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-menu.png b/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-menu.png
deleted file mode 100644
index c2d8a62..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-menu.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/builds-missinglocaldata.png b/bundles/org.eclipse.test.performance.ui/html/images/builds-missinglocaldata.png
deleted file mode 100644
index c49239c..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/builds-missinglocaldata.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/builds-nolocaldata.png b/bundles/org.eclipse.test.performance.ui/html/images/builds-nolocaldata.png
deleted file mode 100644
index a745a51..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/builds-nolocaldata.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/builds-update.png b/bundles/org.eclipse.test.performance.ui/html/images/builds-update.png
deleted file mode 100644
index d3935e5..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/builds-update.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/builds-updateall.png b/bundles/org.eclipse.test.performance.ui/html/images/builds-updateall.png
deleted file mode 100644
index 7740942..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/builds-updateall.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/components.png b/bundles/org.eclipse.test.performance.ui/html/images/components.png
deleted file mode 100644
index 5a41cc7..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/components.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/perspective.png b/bundles/org.eclipse.test.performance.ui/html/images/perspective.png
deleted file mode 100644
index a010ac4..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/perspective.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/preferences-database.png b/bundles/org.eclipse.test.performance.ui/html/images/preferences-database.png
deleted file mode 100644
index 3cbceb4..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/preferences-database.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/preferences-default-dim.png b/bundles/org.eclipse.test.performance.ui/html/images/preferences-default-dim.png
deleted file mode 100644
index cbc02d6..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/preferences-default-dim.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/preferences-eclipse-versions.png b/bundles/org.eclipse.test.performance.ui/html/images/preferences-eclipse-versions.png
deleted file mode 100644
index 2771215..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/preferences-eclipse-versions.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/preferences-lastbuild.png b/bundles/org.eclipse.test.performance.ui/html/images/preferences-lastbuild.png
deleted file mode 100644
index 26d85c0..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/preferences-lastbuild.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/preferences-milestones.png b/bundles/org.eclipse.test.performance.ui/html/images/preferences-milestones.png
deleted file mode 100644
index 7f666af..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/preferences-milestones.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/preferences-results-dim.png b/bundles/org.eclipse.test.performance.ui/html/images/preferences-results-dim.png
deleted file mode 100644
index dbb6726..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/preferences-results-dim.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/preferences-status.png b/bundles/org.eclipse.test.performance.ui/html/images/preferences-status.png
deleted file mode 100644
index 6aa53dd..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/preferences-status.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/preferences.png b/bundles/org.eclipse.test.performance.ui/html/images/preferences.png
deleted file mode 100644
index 321ba22..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/preferences.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/properties-survey-comment.png b/bundles/org.eclipse.test.performance.ui/html/images/properties-survey-comment.png
deleted file mode 100644
index 71255cb..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/properties-survey-comment.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/properties-warnings.png b/bundles/org.eclipse.test.performance.ui/html/images/properties-warnings.png
deleted file mode 100644
index 9954107..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/properties-warnings.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/verification-comment.png b/bundles/org.eclipse.test.performance.ui/html/images/verification-comment.png
deleted file mode 100644
index 7594237..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/verification-comment.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/verification-components.png b/bundles/org.eclipse.test.performance.ui/html/images/verification-components.png
deleted file mode 100644
index 2369c2e..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/verification-components.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/verification-failures.png b/bundles/org.eclipse.test.performance.ui/html/images/verification-failures.png
deleted file mode 100644
index 7c739c4..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/verification-failures.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/write-comparison-menu.png b/bundles/org.eclipse.test.performance.ui/html/images/write-comparison-menu.png
deleted file mode 100644
index d34b368..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/write-comparison-menu.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/write-status-comparison.png b/bundles/org.eclipse.test.performance.ui/html/images/write-status-comparison.png
deleted file mode 100644
index 51cc333..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/write-status-comparison.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/images/write-status-menu.png b/bundles/org.eclipse.test.performance.ui/html/images/write-status-menu.png
deleted file mode 100644
index 41bb7fa..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/images/write-status-menu.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/local_data.html b/bundles/org.eclipse.test.performance.ui/html/local_data.html
deleted file mode 100644
index c2aa4e2..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/local_data.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Local data</title>
-</head>
-
-<body>
-<h1>Local data</h1>
-<p>
-As the connection to the server database is too slow, local files containing
-all necessary information are written while generating performance results on
-the server.
-</p><p>
-The performance results tool then can read these files to avoid long distance
-access to data information. Of course, it's first necessary to copy these files
-on a location easily accessible from the machine where the tool is launched.
-</p>
-<div style="font-style: italic;">
-<p>Notes</p>
-<ul>
-<li>these files are accessible for some authorized users onto
-<b>ottcvs1.ottawa.ibm.com</b> at <b>/home/users/ecperf</b> directory</li>
-<li>SFTP is necessary to copy these files from that location</li>
-</ul>
-</div>
-<p>
-To read the local files, select the <b>Local data -> Read...</b> menu item and
-chose the directory where the files have been copied.
-</p>
-<div style="font-style: italic;">
-<p>Notes</p>
-<ul>
-<li>this manual read action only has to be done once, as it will be automatically
-done at the next start of the tool</li>
-<li>no verification is currently done that the local files matches
-the connected DB (if any). Mixing them should give unpredictable results!</li>
-</ul>
-</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/html/overview.html b/bundles/org.eclipse.test.performance.ui/html/overview.html
deleted file mode 100644
index 17d173a..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/overview.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Overview</title>
-</head>
-
-<body>
-<h1>Overview</h1>
-The performance results tool provide an easy way to look at results collected
-while running performance tests on a build. It is accessible using the
-<b>Performance Results</b> perspective:
-<p><img src="images/perspective.png" alt="Performance Results perspective"/></p>
-<p>
-There are 4 views in this perspective:</p>
-<ul>
-<li><a href="components.html">Components view</a>: This is the view to see
-the results in details for each components</li>
-<li><a href="builds.html">Builds view</a>: This is the view to see all builds,
-update local data and generate results when necessary</li>
-<li><a href="results.html">Components Results view</a>: This is the view to
-see whole results for each machine in a single table</li>
-<li><a href="properties.html">Properties view</a>: Display element properties
-(typically results numbers and other database information)</li>
-</ul>
-<p>
-The goal of this tool is both to look at performance results database numbers
-and to verify whether a build result have scenarios showing performance regression.
-</p><p>
-The view to use to look at performance results number is the
-<a href="components.html">Components view</a>. In this view, results are
-displayed in a hierarchical tree which have a similar structure than
-the generated HTML pages (e.g.
-<a href="http://download.eclipse.org/eclipse/downloads/drops/R-3.6-201006080911/performance/performance.php">Eclipse 3.6.0</a>).
-The complete performance results information is provided on each element of the tree in the
-<a href="properties.html">Properties view</a>. This is typically useful when a scenario
-results looks weird to have the ability to verify that the numbers looks correct
-or not.
-</p><p>
-The view to verify whether a regression occurs is the <a href="results.html">Components Results view</a>.
-All results for one component are shown in a single table which also provides
-all necessary information to decide whether a noticed regression could be confirmed
-or not.
-</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/html/preferences.html b/bundles/org.eclipse.test.performance.ui/html/preferences.html
deleted file mode 100644
index 41b2643..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/preferences.html
+++ /dev/null
@@ -1,134 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Preferences</title>
-</head>
-
-<body>
-<h1>Preferences</h1>
-<p>
-The tool have some preferences which may be configured by advanced users.
-This must be done carefully otherwise, either no data could be read by the tool
-and/or generated results could be puzzled.
-</p><p>
-
-<h3><a name="eclipse_version">Eclipse version</a></h3>
-<p><img src="images/preferences-eclipse-versions.png" alt="Preferences Eclipse versions"/></p>
-<p>
-The Eclipse version on which the performance results belongs to. There are
-only two possible choice: the maintenance and the current versions.
-</p>
-
-<h3><a name="database">Database</a></h3>
-<p><img src="images/preferences-database.png" alt="Preferences Database"/></p>
-<p>
-By default the tool does not connect to any performance results database as common
-users might not have enough rights to access it. However, users having these
-rights may want to look at the database contents and update the local data files
-with it. Hence, it is possible to configure the tool to connect to a database
-which may be either local or on the releng server (<code><b>minsky</b></code>).
-</p><p>
-Note that the folder for the local database must be the parent of the
-<code>perfDb3x</code> folder otherwise you'll get an error message.
-</p>
-
-<h3><a name="status">Status</a></h3>
-<p><img src="images/preferences-status.png" alt="Preferences Status"/></p>
-<p>
-The status preferences can be set to exclude some tests while written
-the status file (see <a href="components.html#writestatus">Write status</a>).
-</p><p>
-Flying over each check-box or radio buttons gives a short explanation of each
-preference value
-</p><p>
-Here are the detailed explanation of these status preferences:
-</p>
-<ul>
-<li><b>Values</b>: Check-box to include the values of the failing tests in the
-status file. Note that is not recommended to do so when status want to be
-compared between builds</li>
-<li><b>Error level</b>: Level of the error from which the test result is
-excluded from the file:
-<ul>
-<li>None: the test is always included in the status file whatever the error
-level is</li>
-<li>Invalid: the test is not included when the error level is over 100%</li>
-<li>Weird: the test is not included when the error level is over 50%</li>
-<li>Suspicious: the test is not included when the error level is over 25%</li>
-<li>Noticeable: the test is not included when the error level is over 3%</li>
-</ul>
-</li>
-<li><b>Small value</b>: The test is not included when a small value is detected:
-<ul>
-<li>Build value: the test is not included when the value for this build test value
-is below than 100ms (<i>as the test duration is below the recommended minimum
-value it's not necessary to strongly survey it...</i>)</li>
-<li>Delta value: the test is not included when the value of the difference between
-the build and the baseline is below than 100ms (<i>as the regression is below
-what a normal user can detect, it may not be necessary to report it...</i>)</li>
-</ul>
-</li>
-<li><b>Statistics</b>: Level of deviation of test history since the first build
-from which the test result is not included in the status file:
-<ul>
-<li>None: the test is always included in the status file whatever the deviation
-is</li>
-<li>Unstable: the test is not included when the deviation is over 10%</li>
-<li>Erratic: the test is not included when the error level is over 20%</li>
-</ul>
-</li>
-<li><b>Builds to confirm</b>: The number of builds to confirm a regression.
-As tests may have <i>natural</i> variation, it's often necessary to have several
-builds to confirm that a regression really occurs. This preference allow to
-define how many consecutive builds must show a regression before including
-a test result in the status file...
-</li>
-</ul>
-
-<h3><a name="milestones">Milestones</a></h3>
-<p><img src="images/preferences-milestones.png" alt="Preferences Milestones"/></p>
-<p>
-These are the list of the version milestones. Each milestone is a date string
-using the <b>yyyymmddHHMM</b> format. When a new milestone is shipped, then a new
-date must be added to this preference to let the tool to identify it in the builds
-list and emphasize it...
-</p>
-
-<h3><a name="lastbuild">Last build</a></h3>
-<p><img src="images/preferences-lastbuild.png" alt="Preferences Last build"/></p>
-<p>
-The last build on which verifications and/or generation want to be done. When
-not set (which is the default value) the last build of the database is taken
-into account.
-</p><p>
-All builds after the selected one are ignored by the tool likewise they would
-have no local data. Changing this value will trigger the initialization of
-the local data which will be read again.
-</p>
-
-<h2><a name="defaultdim">Default dimension</a></h2>
-<p><img src="images/preferences-default-dim.png" alt="Preferences Default dimension"/></p>
-<p>
-This is the dimension used to compute delta and make the verification. Currently
-this is the <b>Elapsed Process Time</b> dimension.
-</p><p>
-<i>Note that the default dimension must belong to the <b>Results dimensions</b>
-described below, hence a new selected dimensions will always be automatically
-added to the list...</i>
-</p>
-
-<h2><a name="resultsdim">Results dimensions</a></h2>
-<p><img src="images/preferences-results-dim.png" alt="Preferences Results dimension"/></p>
-<p>
-These are dimensions displayed in the scenario data HTML pages. Currently there
-are the <b>Elapsed Process Time</b> and the <b>CPU Time</b>. Having these dimensions
-configurable may be interesting to display others dimensions and see whether their
-numbers may be relevant or not (e.g. <b>Used Hava Heap</b>).
-</p><p>
-<i>Note that the default dimension described above must belong to the selected
-dimensions, hence it will always be automatically added to the new selected list...</i>
-</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/html/properties.html b/bundles/org.eclipse.test.performance.ui/html/properties.html
deleted file mode 100644
index c1a5f53..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/properties.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Properties view</title>
-</head>
-
-<body>
-<h1>Properties view</h1>
-<p>
-Properties view contents is different for each select element of the component hierarchy.
-But they all have three sections:
-<ul>
-<li>Results:    Performances results information</li>
-<li>Status:    Various severity messages</li>
-<li>Survey:    Comment added while surveying</li>
-</ul>
-<p>
-Note that the status may have multiple warning messages. So, this property is
-in fact a combo-box, to display all the messages, click on the drop-down button:
-<p><img src="images/properties-warnings.png" alt="Properties warnings"/></p>
-<p>
-It's also possible to add a text into the survey comment on each properties:
-<p><img src="images/properties-survey-comment.png" alt="Properties survey comment"/></p>
-<p>
-This allow to remember what was the conclusion of the last survey concerning an element of the tree...
-</p>
-
-<h2>Component properties</h2>
-TODO
-
-<h2>Scenario properties</h2>
-TODO
-
-<h2>Config properties</h2>
-TODO
-
-<h2>Build properties</h2>
-TODO
-
-<h2>Dimension properties</h2>
-TODO
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/html/results.html b/bundles/org.eclipse.test.performance.ui/html/results.html
deleted file mode 100644
index 253d93b..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/results.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Components Results view</title>
-</head>
-
-<body>
-<h1>Components Results view</h1>
-<p>
-This view show for each of the performance machine the entire results since the beginning.
-</p>
-
-<h2>Config tab</h2>
-<p>
-Each tab of this view represent a performance machine (also named config).
-The name of the machine is the name of the tab. The results are displayed in
-a table where each column represents a scenario and each line a build.
-The lines are ordered in descending order (from the most recent to the oldest build).
-</p><p>
-Here are some tips about this view:
-<ul>
-<li>when old builds are not filtered, the milestone build are highlighted in bold
-+ blueref color background</li>
-<li>results color depends on the diff of the delta with the baseline:
-<ul>
-<li>red: <code>diff &lt;= -5%</code></li>
-<li>magenta: <code>-5% &lt; diff &lt; 0%</code></li>
-<li>black: <code>0% &lt;= diff &lt; +10%</code></li>
-<li>blue: <code>+10% &lt;= diff &lt; +25%</code></li>
-<li>green: <code>diff &gt;= +25%</code></li>
-</ul></li>
-<li>icons have the same meaning than in the Components view</li>
-<li>more information are available in the cell tooltip when either there's a
-warning/information icon and/or when the result is in displayed italic</li>
-</ul>
-
-<h2>Filters</h2>
-<p>
-There are 3 possible filters in this view:
-</p>
-<h3>Builds filters</h3>
-<ul>
-<li>Old: hide all builds before last milestone except earlier milestones</li>
-</ul>
-
-<h3>Scenarios filter</h3>
-<ul>
-<li>Advanced scenarios: hide the scenarios which are not in the fingerprints</li>
-</ul>
-<p>
-These filters are synchronized with the Components view, hence have the same default.
-</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/html/verification.html b/bundles/org.eclipse.test.performance.ui/html/verification.html
deleted file mode 100644
index ce750b3..0000000
--- a/bundles/org.eclipse.test.performance.ui/html/verification.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-    <title>Verification</title>
-</head>
-
-<body>
-<h1>Verification</h1>
-<p>
-While verifying a build results, the first thing to do is to look for failures.
-The tool helps to know rapidly which components have failure showing a red-cross
-icon in the <a href="components.html">Components view</a>:</p>
-<p><img src="images/verification-components.png" alt="Verification: failing components"/></p>
-<p>
-When clicking on one of the component having error(s), the tool automatically
-selects the first configuration (i.e. test machine) which has an error in its
-last build results. Then, flying over the failures may give a first indication
-whether the regressions are confirmed or not.
-</p><p>
-In the following example, a tool tip is displayed saying that the deviation has
-a small value and may be not enough important to report a bug:
-<p><img src="images/verification-failures.png" alt="Verification: failing test"/></p>
-<p>
-Then this analyze can be stored to see whether this scenario will still have
-a similar error on the next build performance run:
-<p><img src="images/verification-comment.png" alt="Verification: failure comment"/></p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/plugin.xml b/bundles/org.eclipse.test.performance.ui/plugin.xml
index 7ab9919..a874429 100644
--- a/bundles/org.eclipse.test.performance.ui/plugin.xml
+++ b/bundles/org.eclipse.test.performance.ui/plugin.xml
@@ -21,81 +21,11 @@
          </run>
       </application>
    </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            class="org.eclipse.test.internal.performance.results.ui.PerformanceResultsPreferencePage"
-            id="org.eclipse.test.performance.ui.prpp"
-            name="%page.name">
-      </page>
-   </extension>
 
    <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%category.name"
-            id="Performances">
-      </category>
-      <view
-            category="Performances"
-            class="org.eclipse.test.internal.performance.results.ui.ComponentsView"
-            icon="$nl$/icons/components.gif"
-            id="org.eclipse.test.internal.performance.results.ui.ComponentsView"
-            name="%view.name">
-      </view>
-      <view
-            category="Performances"
-            class="org.eclipse.test.internal.performance.results.ui.BuildsView"
-            icon="$nl$/icons/builds.gif"
-            id="org.eclipse.test.internal.performance.results.ui.BuildsView"
-            name="%view.name.0">
-      </view>
-      <view
-            category="Performances"
-            class="org.eclipse.test.internal.performance.results.ui.ComponentResultsView"
-            icon="$nl$/icons/results.gif"
-            id="org.eclipse.test.internal.performance.results.ui.ComponentsResultsView"
-            name="%view.name.1"
-            restorable="true">
-      </view>
-      <view
-            category="Performances"
-            class="org.eclipse.test.internal.performance.results.ui.BuildsComparisonView"
-            icon="$nl$/icons/compare_view.gif"
-            id="org.eclipse.test.internal.performance.results.ui.BuildsComparisonView"
-            name="%view.name.2"
-            restorable="true">
-      </view>
-   </extension>
-   <extension
          point="org.eclipse.core.runtime.preferences">
       <initializer
             class="org.eclipse.test.internal.performance.results.ui.PerformanceResultsPreferenceInitializer">
       </initializer>
    </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="org.eclipse.test.internal.performance.results.ui.PerformanceResultsPerspective"
-            icon="$nl$/icons/perfs.gif"
-            id="org.eclipse.test.performance.ui.perspectives.PerformanceResultsPerspective"
-            name="%perspective.name">
-         <description>
-            %perspective.description
-         </description>
-      </perspective>
-   </extension>
-   <extension
-         point="org.eclipse.help.contexts">
-      <contexts
-            file="contexts.xml">
-      </contexts>
-   </extension>
-   <extension
-         point="org.eclipse.help.toc">
-      <toc
-            file="toc.xml"
-            primary="true">
-      </toc>
-   </extension>
 </plugin>
diff --git a/bundles/org.eclipse.test.performance.ui/readme.html b/bundles/org.eclipse.test.performance.ui/readme.html
index 393e745..77b3b74 100644
--- a/bundles/org.eclipse.test.performance.ui/readme.html
+++ b/bundles/org.eclipse.test.performance.ui/readme.html
@@ -1,77 +1,159 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html lang="en">
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-        <title>org.eclipse.test.performance.ui readme</title>
-    </head>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<title>org.eclipse.test.performance.ui readme</title>
+</head>
 
-<p><b><font size="+2">README</font></b><br> </p><p>Last updated: October 26, 2005<br> 
-</p><p><b>Introduction</b><br> <br> This readme describes how to create performance 
-charts and tables similar to those available on the eclipse platform download 
-pages using the stand-alone java program <b>org.eclipse.test.performance.ui.Main</b> 
-stored in this project. Although the program is currently geared to generating 
-results for the Eclipse Platform builds, the program may work for you given the 
-following conditions:</p><ul> <li>The &quot;eclipse.perf.config&quot; system property 
-used to run tests used three keys config, build and jvm <ul> <li>for example, 
-"eclipse.perf.config=config=relengbuildwin2;build=I20050219-1500;jvm=sun1.4.2_06". 
-<br> <br> </li></ul></li><li>Values for the "build" key begin with either an 'I' 
-or 'N' with the exception of the reference builds (for example, 3.0). <ul> <li>The 
-line graphs plot the reference build, all builds starting with 'I' and the seven 
-'N' builds preceding the current build.</li><li>This can be overriden with the use of the &quot;-current.prefix&quot; parameter where you can specify a comma-separated list of prefixes for build ids to include in the main line graph.<br> <br> </li></ul></li><li>Scenario names 
-all contain a prefix &quot;&lt;component&gt;.test&quot; <ul> <li>For example, 
-it is assumed that the scenario &quot;org.eclipse.help.tests.performance.appserver.TestAppserver#testAppserverCycle()&quot; 
-belongs to the &quot;org.eclipse.help&quot; component. </li><li>Unique scenario 
-prefixes are derived from all the scenarios in the database and are used to group 
-results.</li></ul></li></ul><p><br> For purposes of this document, the term &quot;<a href="images/descriptions.html#fp">fingerprint</a>&quot; 
-will be used to refer to a bar graph which represents the performance summary 
-at a global or component level for each test configuration.<br> <br> The term 
-&quot;<a href="images/descriptions.html#sst">scenario status table</a>&quot; will 
-be used to refer to a table of scenarios with green checks and red x indicators 
-below a component fingerprint. This table gives an overall view of the status 
-for all scenarios for a component for all configurations.<br> </p><p>The term 
-&quot;<a href="images/descriptions.html#sr">scenario results</a>&quot; will be 
-used to refer to a web page comparing current performance measurements to the 
-baseline measurements for one scenario on one configuration. The web page displays 
-the raw data for the current and baseline measurements and also displays line 
-graphs showing the measured values over the course of builds between the current 
-and baseline.</p><p><br> <b>Requirements</b> </p><ul> <li>Windows or Linux (x86) 
-operating system</li><li>Cloudscape or Derby plug-in</li><li>org.eclipse.releng.basebuilder</li><li>1.4 
-level jvm installed and on path</li></ul><p><b>Setup</b><br> </p><ul> <li>Checkout 
-org.eclipse.releng.basebuilder from cvs repository dev.eclipse.org:/home/eclipse 
-(HEAD should be fine).</li><li>Create a Cloudscape or derby plug-in as described 
-<A HREF="http://dev.eclipse.org/viewcvs/index.cgi/*checkout*/org.eclipse.test.performance/doc/Performance%20Tests%20HowTo.html?rev=HEAD&content-type=text/html#cloudscape">here</A>.</li><li>Set 
-the environment variable &quot;dbloc&quot; to the location of the database containing 
-the performance data<br> For example:<br> <ul> <li> export dbloc=net://minsky.ottawa.ibm.com 
-(Linux)</li><li>set dbloc==net://minsky.ottawa.ibm.com (Windows)<br> </li></ul></li></ul><p><b>Running 
-the program</b></p><p>From a terminal or dos prompt,<br> </p><OL><LI>Set the environment 
-variable &quot;dbloc&quot; to the location of the database containing the performance 
-data<BR> For example:<UL><LI>export dbloc=net://minsky.ottawa.ibm.com (Linux)</LI><LI>set 
-dbloc==net://minsky.ottawa.ibm.com (Windows)<BR><BR></LI></UL></LI><LI>cd 
-to org.eclipse.releng.basebuilder\plugins\org.eclipse.test.performance.ui\scripts<BR></LI><LI>If 
-running on Linux, execute &quot;chmod 755 genresults&quot;</LI><LI>Execute the 
-following command:<b><br> <br> genresults -baseline &lt;baseline build id&gt; 
--current &lt;current build id&gt; -config &lt;comma-separated list of configs&gt; 
--jvm &lt;jvm name&gt; -output &lt;output dir&gt; [-config.properties &lt;properties&gt;] 
-[highlight &lt;buildid patterns&gt;] [scenario.pattern &lt;scenario prefix 
-patterns&gt;] [-fingerprints][-scenarioresults][-current.prefix &lt;comma-separated list of build id prefixes&gt;][-baseline.prefix &lt;comma-separated list of build id prefixes&gt;]</b></LI></OL><br> Parameter descriptions: 
-<blockquote> <p>-baseline &lt;baseline build id. A previous value used in the 
-&quot;build&quot; key in the eclipse.perf.config system property or the eclipse.perf.assertAgainst 
-property. &gt; <br> -current &lt;current build id. The value used in the &quot;build&quot; 
-key in the eclipse.perf.config system property.&gt;<br> -config &lt;a comma-separated 
-list of names of configurations for which to produce results. The values used 
-should be the same as values specified for the &quot;config&quot; key in the eclipse.perf.config 
-system property.&gt;<br> -jvm &lt;jvm description. The value used in the &quot;jvm&quot; 
-key in the eclipse.perf.config system property.&gt;<br> -output &lt;path to an 
-output directory for fingerprints and scenarios for each configuration specified 
-in -config parameter. Fingerprint gifs and html files are generated in the directory 
-specified, configuration specific subdirectories are created to store scenario 
-results and line graphs.&gt;</p></blockquote><p><br> Optional arguments:</p><blockquote> 
-<p>-config.properties &lt;semi-colon separated list of: config, alternate config 
-description.  The value should be quoted if there are spaces in the value.&gt;<BR>of builds which match any prefix in this list.  When omitted, a magenta line is draw on the graph which represents the baseline value specified in the -baseline parameter.&gt;<br> -highlight &lt;Comma-separated 
-list of build Id prefixes(excluding 'I' and 'N'), which are used to add and highlight 
-the most recent matching buildId on line graphs.&quot;&gt;<br> -scenario.pattern 
-&lt;Scenario prefix pattern used to query performance results database. Can be 
-used to generate results for a single component or subset of scenarios.&gt;<br> 
--fingerprints or -scenarioresults &lt;use one or the other to generate fingerprints 
-or scenario results only. Not specifying either will execute both.&gt;<BR>-baseline.prefix &lt;semi-colon separated list of: build id prefixes used in eclipse.perf.assertAgainst property or eclipse.perf.config system property.  Values used to generate a second line graph representing changes in repeated baseline test runs&gt;.<BR>-current.prefix &lt;semi-colon separated list of: build id prefixes used in eclipse.perf.config system property.  Values here used to override default of &quot;N,I&quot;.  Used to select build id's to include in main line graph.&gt;</p></blockquote>
+<p>
+	<b><font size="+2">README</font></b><br>
+</p>
+<p>
+	Last updated: October 26, 2005<br>
+</p>
+<p>
+	<b>Introduction</b><br> <br> This readme describes how to
+	create performance charts and tables similar to those available on the
+	eclipse platform download pages using the stand-alone java program <b>org.eclipse.test.performance.ui.Main</b>
+	stored in this project. Although the program is currently geared to
+	generating results for the Eclipse Platform builds, the program may
+	work for you given the following conditions:
+</p>
+<ul>
+	<li>The &quot;eclipse.perf.config&quot; system property used to
+		run tests used three keys config, build and jvm
+		<ul>
+			<li>for example,
+				"eclipse.perf.config=config=relengbuildwin2;build=I20050219-1500;jvm=sun1.4.2_06".
+				<br> <br>
+			</li>
+		</ul>
+	</li>
+	<li>Values for the "build" key begin with either an 'I' or 'N'
+		with the exception of the reference builds (for example, 3.0).
+		<ul>
+			<li>The line graphs plot the reference build, all builds
+				starting with 'I' and the seven 'N' builds preceding the current
+				build.</li>
+			<li>This can be overriden with the use of the
+				&quot;-current.prefix&quot; parameter where you can specify a
+				comma-separated list of prefixes for build ids to include in the
+				main line graph.<br> <br>
+			</li>
+		</ul>
+	</li>
+	<li>Scenario names all contain a prefix
+		&quot;&lt;component&gt;.test&quot;
+		<ul>
+			<li>For example, it is assumed that the scenario
+				&quot;org.eclipse.help.tests.performance.appserver.TestAppserver#testAppserverCycle()&quot;
+				belongs to the &quot;org.eclipse.help&quot; component.</li>
+			<li>Unique scenario prefixes are derived from all the scenarios
+				in the database and are used to group results.</li>
+		</ul>
+	</li>
+</ul>
+<p>
+	<br> For purposes of this document, the term &quot;<a
+		href="images/descriptions.html#fp">fingerprint</a>&quot; will be used
+	to refer to a bar graph which represents the performance summary at a
+	global or component level for each test configuration.<br> <br>
+	The term &quot;<a href="images/descriptions.html#sst">scenario
+		status table</a>&quot; will be used to refer to a table of scenarios with
+	green checks and red x indicators below a component fingerprint. This
+	table gives an overall view of the status for all scenarios for a
+	component for all configurations.<br>
+</p>
+<p>
+	The term &quot;<a href="images/descriptions.html#sr">scenario
+		results</a>&quot; will be used to refer to a web page comparing current
+	performance measurements to the baseline measurements for one scenario
+	on one configuration. The web page displays the raw data for the
+	current and baseline measurements and also displays line graphs showing
+	the measured values over the course of builds between the current and
+	baseline.
+</p>
+<p>
+	<br> <b>Requirements</b>
+</p>
+<ul>
+	<li>Windows or Linux (x86) operating system</li>
+	<li>org.eclipse.releng.basebuilder</li>
+	<li>JVM 11 installed and on path</li>
+</ul>
+<p>
+	<b>Running the program</b>
+</p>
+<p>
+	From a terminal or dos prompt,<br>
+</p>
+<OL>
+	<LI>cd to
+		org.eclipse.releng.basebuilder\plugins\org.eclipse.test.performance.ui\scripts<BR>
+	</LI>
+	<LI>If running on Linux, execute &quot;chmod 755 genresults&quot;</LI>
+	<LI>Execute the following command:<b><br> <br>
+			genresults -baseline &lt;baseline build id&gt; -current &lt;current
+			build id&gt; -config &lt;comma-separated list of configs&gt; -jvm
+			&lt;jvm name&gt; -output &lt;output dir&gt; [-config.properties
+			&lt;properties&gt;] [highlight &lt;buildid patterns&gt;]
+			[scenario.pattern &lt;scenario prefix patterns&gt;]
+			[-fingerprints][-scenarioresults][-current.prefix &lt;comma-separated
+			list of build id prefixes&gt;][-baseline.prefix &lt;comma-separated
+			list of build id prefixes&gt;]</b></LI>
+</OL>
+<p>
+	<br> Parameter descriptions:
+</p>
+<blockquote>
+	<ul>
+		<li>-baseline - baseline build id. A previous value used in the
+			&quot;build&quot; key in the eclipse.perf.config system property or
+			the eclipse.perf.assertAgainst property.</li>
+		<li>-current - current build id. The value used in the
+			&quot;build&quot; key in the eclipse.perf.config system property.</li>
+		<li>-config - a comma-separated list of names of configurations
+			for which to produce results. The values used should be the same as
+			values specified for the &quot;config&quot; key in the
+			eclipse.perf.config system property.&gt;<br> -jvm &lt;jvm
+			description. The value used in the &quot;jvm&quot; key in the
+			eclipse.perf.config system property.
+		</li>
+		<li>-output - path to an output directory for fingerprints and
+			scenarios for each configuration specified in -config parameter.
+			Fingerprint gifs and html files are generated in the directory
+			specified, configuration specific subdirectories are created to store
+			scenario results and line graphs.</li>
+	</ul>
+</blockquote>
+<p>
+	<br> Optional arguments:
+</p>
+<blockquote>
+	<ul>
+		<li>-config.properties - semi-colon separated list of: config,
+			alternate config description. The value should be quoted if there are
+			spaces in the value.<BR>of builds which match any prefix in this
+			list. When omitted, a magenta line is draw on the graph which
+			represents the baseline value specified in the -baseline parameter.
+		</li>
+		<li>-highlight - Comma-separated list of build Id
+			prefixes(excluding 'I' and 'N'), which are used to add and highlight
+			the most recent matching buildId on line graphs.</li>
+		<li>-scenario.pattern - Scenario prefix pattern used to query
+			performance results database. Can be used to generate results for a
+			single component or subset of scenarios.</li>
+		<li>-fingerprints or -scenarioresults - use one or the other to
+			generate fingerprints or scenario results only. Not specifying either
+			will execute both.</li>
+		<li>-baseline.prefix - semi-colon separated list of: build id
+			prefixes used in eclipse.perf.assertAgainst property or
+			eclipse.perf.config system property. Values used to generate a second
+			line graph representing changes in repeated baseline test run.</li>
+		<li>-current.prefix - semi-colon separated list of: build id
+			prefixes used in eclipse.perf.config system property. Values here
+			used to override default of &quot;N,I&quot;. Used to select build
+			id's to include in main line graph.</li>
+	</ul>
+</blockquote>
 </html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonTab.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonTab.java
deleted file mode 100644
index f3ed434..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonTab.java
+++ /dev/null
@@ -1,542 +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.ui;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.ToolTip;
-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.db.PerformanceResults;
-import org.eclipse.test.internal.performance.results.db.ScenarioResults;
-import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
-import org.eclipse.test.internal.performance.results.model.PerformanceResultsElement;
-import org.eclipse.test.internal.performance.results.model.ResultsElement;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-
-
-/**
- * Tab to display all performances results numbers for a configuration (i.e a performance machine).
- */
-public class BuildsComparisonTab {
-
-	// Colors
-	static final Display DEFAULT_DISPLAY = Display.getDefault();
-	static final Color BLUE= DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_BLUE);
-	static final Color DARK_GREEN= DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_DARK_GREEN);
-	static final Color GRAY = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_GRAY);
-	static final Color MAGENTA = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_MAGENTA);
-	static final Color RED = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_RED);
-
-	// SWT resources
-	Shell shell;
-	Display display;
-	Table table;
-	private GC gc;
-	private Color lightred;
-	private Color lightyellow;
-	private Color darkyellow;
-	private Color blueref;
-	private Font boldFont;
-	private Font italicFont;
-	private Font boldItalicFont;
-	Map<Point, ToolTip> toolTips;
-
-	// Information
-	String componentName;
-	double[][] allValues;
-	double[][] allErrors;
-
-	// Cells management
-	Point tableOrigin, tableSize;
-	int columnsCount, rowsCount;
-	List<List<Object>> firstLine;
-
-	// Eclipse preferences
-	private IEclipsePreferences preferences;
-
-/*
- * Default constructor.
- */
-public BuildsComparisonTab(String name) {
-    this.componentName = name;
-	this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-}
-
-/**
- * Creates the tab folder page.
- *
- * @param view The view on which to create the tab folder page
- * @return the new page for the tab folder
- */
-Composite createTabFolderPage (BuildsComparisonView view) {
-	// Cache the shell and display.
-	this.shell = view.tabFolder.getShell();
-	this.display = this.shell.getDisplay();
-
-	// Remove old table if present
-	boolean initResources = this.table == null;
-	if (this.table != null) {
-		disposeTable();
-	}
-
-	// Create the "children" table
-	int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION;
-	this.table = new Table(view.tabFolder, style);
-	this.table.setLinesVisible (true);
-	this.table.setHeaderVisible (true);
-	GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
-	gridData.heightHint = 150;
-	this.table.setLayoutData (gridData);
-	this.gc = new GC(this.table);
-
-	// Init resources
-	if (initResources) initResources();
-
-	// Add columns to the table
-	TableColumn firstColumn = new TableColumn(this.table, SWT.CENTER);
-	firstColumn.setText("");
-	PerformanceResultsElement results = view.getResults();
-	String [] configDescriptions = results.getConfigDescriptions();
-	int length = configDescriptions.length;
-	for (int i = 0; i < length; i++) {
-		TableColumn column = new TableColumn(this.table, SWT.CENTER);
-		column.setText(configDescriptions[i]);
-	}
-
-	// Add lines to the table
-	this.toolTips = new HashMap<>();
-	boolean fingerprints = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
-	fillTable(results, view.currentBuild, view.referenceBuild, fingerprints);
-
-	// Updated columns
-	for (int i=0; i<=length; i++) {
-		TableColumn column = this.table.getColumn(i);
-		column.setWidth(i==0?120:100);
-	}
-
-	// Store table info
-	this.columnsCount = length;
-
-	// Listen to mouse track events to display the table cell corresponding tooltip.
-	MouseTrackListener mouseTrackListener = new MouseTrackListener() {
-		ToolTip currentTooltip;
-		@Override
-    public void mouseHover(MouseEvent e) {
-			if (this.currentTooltip != null) {
-				this.currentTooltip.setVisible(false);
-				this.currentTooltip = null;
-			}
-			Point cellPosition = currentCellPosition(e.x, e.y);
-			if (cellPosition != null) {
-				ToolTip tooltip = BuildsComparisonTab.this.toolTips.get(cellPosition);
-				if (tooltip != null) {
-					Point location = BuildsComparisonTab.this.table.toDisplay(new Point(e.x, e.y));
-					tooltip.setLocation(location);
-					tooltip.setVisible(true);
-					this.currentTooltip = tooltip;
-				}
-			}
-		}
-		@Override
-    public void mouseEnter(MouseEvent e) {
-		}
-		@Override
-    public void mouseExit(MouseEvent e) {
-		}
-	};
-	this.table.addMouseTrackListener(mouseTrackListener);
-
-	// Select the first line by default (as this is the current build)
-	this.table.select(0);
-
-	// Return the built composite
-	return this.table;
-}
-
-/*
- * Create and store a tooltip with the given information and at the given position.
- */
-void createToolTip(String toolTipText, String toolTipMessage, int toolTipStyle, Point position) {
-	ToolTip toolTip = new ToolTip(this.table.getShell(), toolTipStyle);
-	toolTip.setAutoHide(true);
-	toolTip.setText(toolTipText);
-	toolTip.setMessage(/*"("+col+","+row+") "+*/toolTipMessage);
-	this.toolTips.put(position, toolTip);
-}
-
-/*
- * Get the current cell position (column, row) from a point position.
- */
-Point currentCellPosition(int x, int y) {
-
-	// Compute the origin of the visible area
-	if (this.tableOrigin == null) {
-		this.tableOrigin = new Point(0, this.table.getHeaderHeight());
-	}
-
-	// Increment width until over current y position
-	int height= this.tableOrigin.y;
-	int row = this.table.getTopIndex();
-	while (row<this.rowsCount && height<y) {
-		height += this.table.getItemHeight();
-		row++;
-	}
-	if (height < y) {
-		// return when position is over the last line
-		return null;
-	}
-	row--;
-
-	// Increment width until being over current x position
-	int col = 0;
-	TableItem tableItem = this.table.getItem(row);
-	Rectangle bounds = tableItem.getBounds(col);
-	while (col<this.columnsCount) {
-		int max = bounds.x + bounds.width + this.table.getGridLineWidth();
-		if (x <= max) break;
-		if (col == this.columnsCount) {
-			// return when position is over the last column
-			return null;
-		}
-		col++;
-		bounds = tableItem.getBounds(col);
-	}
-
-	// Return the found table cell position
-	return new Point(col, row);
-}
-
-/*
- * Dispose all SWT resources.
- */
-public void dispose() {
-	if (this.boldFont != null) {
-		this.boldFont.dispose();
-	}
-	if (this.italicFont != null) {
-		this.italicFont.dispose();
-	}
-	if (this.boldItalicFont != null) {
-		this.boldItalicFont.dispose();
-	}
-	if (this.darkyellow != null) {
-		this.darkyellow.dispose();
-	}
-	if (this.lightyellow != null) {
-		this.lightyellow.dispose();
-	}
-	if (this.lightred != null) {
-		this.lightred.dispose();
-	}
-	if (this.blueref != null) {
-		this.blueref.dispose();
-	}
-	disposeTable();
-}
-
-/*
- * Dispose all SWT controls associated with the table.
- */
-private void disposeTable() {
-	if (this.toolTips != null) {
-		Iterator<Point> cells = this.toolTips.keySet().iterator();
-		while (cells.hasNext()) {
-			ToolTip toolTip = this.toolTips.get(cells.next());
-			toolTip.dispose();
-		}
-	}
-	this.table.dispose();
-	this.tableOrigin = null;
-	this.firstLine = null;
-}
-
-/*
- * Fill the lines of the tables.
- * Get all the information from the model which are returned in a list (lines) of lists (columns).
- */
-private void fillTable(PerformanceResultsElement results, String currentBuild, String referenceBuild, boolean fingerprints) {
-
-	// Get all the scenario for the component
-	final PerformanceResults performanceResults = results.getPerformanceResults();
-	List<AbstractResults> scenarios = performanceResults.getComponentScenarios(this.componentName);
-	int size = scenarios.size();
-
-	// Get thresholds
-	int failurePref = this.preferences.getInt(IPerformancesConstants.PRE_COMPARISON_THRESHOLD_FAILURE, IPerformancesConstants.DEFAULT_COMPARISON_THRESHOLD_FAILURE);
-	int errorPref = this.preferences.getInt(IPerformancesConstants.PRE_COMPARISON_THRESHOLD_ERROR, IPerformancesConstants.DEFAULT_COMPARISON_THRESHOLD_ERROR);
-	int improvementPref = this.preferences.getInt(IPerformancesConstants.PRE_COMPARISON_THRESHOLD_IMPROVEMENT, IPerformancesConstants.DEFAULT_COMPARISON_THRESHOLD_IMPROVEMENT);
-	final double failureThreshold = -failurePref / 100.0;
-	final double errorThreshold = errorPref / 100.0;
-	final double improvementThreshold = improvementPref / 100.0;
-
-	// Build the map made of one line per scenario results
-	final String[] configs = performanceResults.getConfigNames(true/*sort*/);
-	for (int i=0; i<size; i++) {
-		ScenarioResults scenarioResults = (ScenarioResults) scenarios.get(i);
-		if (!scenarioResults.isValid()) continue;
-		final boolean fingerprint = scenarioResults.hasSummary();
-		if (!fingerprints || fingerprint) {
-
-			// The first column is the scenario name
-			String scenarioName = scenarioResults.getShortName();
-			TableItem item = new TableItem (this.table, SWT.NONE);
-			item.setText(scenarioName);
-
-			// Bold font and blue ref background color if this is a fingerprint test
-			Font italic;
-			if (fingerprint) {
-				item.setFont(0, this.boldFont);
-				item.setBackground(this.blueref);
-				italic = this.boldItalicFont;
-			} else {
-				italic = this.italicFont;
-			}
-
-			// Fill config columns
-			int length = configs.length;
-			for (int j=0; j<length; j++) {
-
-				// See whether there's available numbers
-				int col = j+1;
-				final ConfigResults configResults = scenarioResults.getConfigResults(configs[j]);
-				if (configResults == null || !configResults.isValid()) {
-					item.setText(col, "Invalid");
-					item.setForeground(col, GRAY);
-					item.setFont(col, italic);
-					continue;
-				}
-				final BuildResults buildResults = configResults.getBuildResults(currentBuild);
-				if (buildResults == null) {
-					item.setText(col, "Missing results");
-					item.setForeground(col, GRAY);
-					item.setFont(col, italic);
-					continue;
-				}
-				final BuildResults referenceResults = configResults.getBuildResults(referenceBuild);
-				if (referenceResults == null) {
-					item.setText(col, "Missing ref");
-					item.setForeground(col, GRAY);
-					item.setFont(col, italic);
-					continue;
-				}
-
-				// Get numbers and infos
-				double[] values = configResults.getNumbers(buildResults, referenceResults);
-
-				// Reset tooltip info
-				String toolTipText = null;
-				String toolTipMessage = null;
-				int toolTipStyle = SWT.BALLOON;
-
-				// Get values array
-				final double buildValue = values[AbstractResults.BUILD_VALUE_INDEX];
-				final double referenceValue = values[AbstractResults.BASELINE_VALUE_INDEX];
-				final double delta = values[AbstractResults.DELTA_VALUE_INDEX];
-				final double error = values[AbstractResults.DELTA_ERROR_INDEX];
-
-				// Set text with delta value
-				final StringBuilder address = new StringBuilder("http://fullmoon.ottawa.ibm.com/downloads/drops/");
-				address.append(currentBuild);
-				address.append("/performance/");
-				address.append(configResults.getName());
-				address.append('/');
-				address.append(scenarioResults.getFileName());
-				address.append(".html");
-				StringBuilder buffer = new StringBuilder("<a href=\"");
-				buffer.append(address);
-				buffer.append("\">");
-				final String itemText = Util.PERCENTAGE_FORMAT.format(delta);
-				buffer.append(itemText);
-				buffer.append("</a>");
-
-				// Simple text
-				item.setText(col, itemText);
-
-				/* Link + Editor
-				Link link = new Link(this.table, SWT.CENTER);
-				link.setText(buffer.toString());
-				link.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						Program.launch(address.toString());
-					}
-				});
-				final TableEditor editor = new TableEditor(this.table);
-				editor.grabHorizontal = editor.grabVertical = true;
-				editor.verticalAlignment = SWT.CENTER;
-				editor.horizontalAlignment = SWT.CENTER;
-				editor.setEditor(link, item, col);
-				*/
-
-				// Compute the tooltip to display on the cell
-				if (error > errorThreshold) {
-					// error is over the threshold
-					item.setForeground(col, this.darkyellow);
-					toolTipText = "May be not reliable";
-					toolTipMessage = "The error on this result is "+Util.PERCENTAGE_FORMAT.format(error)+", hence it may be not reliable";
-					toolTipStyle |= SWT.ICON_WARNING;
-				}
-				if (delta < -0.1) {
-					// delta < -10%: failure shown by an red-cross icon + text in red
-					item.setImage(col, ResultsElement.ERROR_IMAGE);
-				}
-				if (delta < failureThreshold) {
-					// negative delta over the threshold shown in red
-					item.setForeground(col, RED);
-				} else if (delta > improvementThreshold) {
-					// positive delta over the threshold are shown in green
-					item.setForeground(col, DARK_GREEN);
-				}
-
-				// Moderate the status if the build value or the difference is small
-				if (buildValue < 100 || referenceValue < 100) {
-					if (toolTipText == null) {
-						toolTipText = "";
-					} else {
-						toolTipText += ", ";
-					}
-					toolTipText += "Small value";
-					if (toolTipMessage == null) {
-						toolTipMessage = "";
-					} else {
-						toolTipMessage += ".\n";
-					}
-					toolTipMessage += "This test has a small value ("+buildValue+"ms)";
-					toolTipStyle |= SWT.ICON_WARNING;
-					item.setImage(col, ResultsElement.WARN_IMAGE);
-				}
-
-				// Add information in tooltip when history shows big variation
-				double deviation = configResults.getStatistics(Util.BASELINE_BUILD_PREFIXES)[3];
-				if (deviation > 0.2) {
-					// deviation is over 20% over the entire history
-					if (toolTipText == null) {
-						toolTipText = "";
-					} else {
-						toolTipText += ", ";
-					}
-					toolTipText += "History shows erratic values";
-					if (toolTipMessage == null) {
-						toolTipMessage = "";
-					} else {
-						toolTipMessage += ".\n";
-					}
-					toolTipMessage += "The results history shows that the variation of its delta is over 20% ("+Util.PERCENTAGE_FORMAT.format(deviation)+"), hence its result is surely not reliable";
-					// set the text in italic
-					item.setFont(col, italic);
-					toolTipStyle |= SWT.ICON_INFORMATION;
-				} else if (deviation > 0.1) { // moderate the status when the test
-					// deviation is between 10% and 20% over the entire history
-					if (toolTipText == null) {
-						toolTipText = "";
-					} else {
-						toolTipText += ", ";
-					}
-					toolTipText += "History shows unstable values";
-					if (toolTipMessage == null) {
-						toolTipMessage = "";
-					} else {
-						toolTipMessage += ".\n";
-					}
-					toolTipMessage += "The results history shows that the variation of its delta is between 10% and 20% ("+Util.PERCENTAGE_FORMAT.format(deviation)+"), hence its result may not be really reliable";
-					// set the text in italic
-					item.setFont(col, italic);
-					if (toolTipStyle == SWT.BALLOON && delta >= -0.1) {
-						toolTipStyle |= SWT.ICON_INFORMATION;
-					} else {
-						// reduce icon severity from error to warning
-						toolTipStyle |= SWT.ICON_WARNING;
-					}
-				}
-
-				// Set tooltip
-				if (toolTipText != null) {
-					createToolTip(toolTipText, toolTipMessage, toolTipStyle, new Point(col, i));
-				}
-			}
-		}
-	}
-	this.rowsCount = size;
-}
-
-protected Shell getShell() {
-	return this.shell;
-}
-
-/*
- * The tab text is the full machine name.
- */
-public String getTabText() {
-	return Util.componentDisplayName(this.componentName);
-}
-
-/*
- * Init the SWT resources
- */
-private void initResources() {
-	// Fonts
-	String fontDataName = this.gc.getFont().getFontData()[0].toString();
-	FontData fdItalic = new FontData(fontDataName);
-	fdItalic.setStyle(SWT.ITALIC);
-	this.italicFont = new Font(this.display, fdItalic);
-	FontData fdBold = new FontData(fontDataName);
-	fdBold.setStyle(SWT.BOLD);
-	this.boldFont = new Font(this.display, fdBold);
-	FontData fdBoldItalic = new FontData(fontDataName);
-	fdBoldItalic.setStyle(SWT.BOLD | SWT.ITALIC);
-	this.boldItalicFont = new Font(this.display, fdBoldItalic);
-
-	// Colors
-	this.lightred = new Color(DEFAULT_DISPLAY, 220, 50, 50);
-	this.lightyellow = new Color(DEFAULT_DISPLAY, 255, 255, 160);
-	this.darkyellow = new Color(DEFAULT_DISPLAY, 160, 160, 0);
-	this.blueref = new Color(DEFAULT_DISPLAY, 200, 200, 255);
-}
-
-/*
- * Select the line corresponding to the given build.
- */
-void select(BuildResultsElement buildResultsElement) {
-	int count = this.table.getItemCount();
-	String buildName = buildResultsElement.getName();
-	TableItem[] items = this.table.getItems();
-	for (int i=0; i<count; i++) {
-		if (items[i].getText().endsWith(buildName)) {
-			this.table.deselect(this.table.getSelectionIndex());
-			this.table.select(i);
-			return;
-		}
-	}
-}
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonView.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonView.java
deleted file mode 100644
index ed54f0f..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonView.java
+++ /dev/null
@@ -1,376 +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.ui;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
-import org.eclipse.test.internal.performance.results.model.PerformanceResultsElement;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-
-/**
- * This view shows the difference between two selected builds.
- * <p>
- * Each component are shown in a separate tab.
- * </p><p>
- * The displayed results can be written in a file, either all component or only
- * the current one.
- * </p><p>
- * It's also possible to filter the scenario to display only the fingerprint ones.
- * <br>
- * Note that this filter is synchronized with the one applied in the
- * {@link ComponentsView Components view}.
- * </p>
- *
- * @see ConfigTab Folder tab containing all the results for a configuration.
- */
-public class BuildsComparisonView extends ViewPart implements ISelectionChangedListener, IPreferenceChangeListener {
-
-	// SWT resources
-	Shell shell;
-	CTabFolder tabFolder;
-
-	// Model information
-	BuildsComparisonTab[] tabs;
-	PerformanceResultsElement results;
-
-	// Action
-	Action filterAdvancedScenarios;
-	Action writeComparison;
-
-	// Write Status
-	static int WRITE_STATUS;
-
-	// Views
-	BuildsView buildsView;
-	IMemento viewState;
-
-	// Eclipse preferences
-	IEclipsePreferences preferences;
-
-	// Comparison
-	String currentBuild;
-	String referenceBuild;
-
-/*
- * Default constructor:
- * 	- create the image descriptor
- * 	- register the view as a properties listener
- */
-public BuildsComparisonView() {
-	this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-	this.preferences.addPreferenceChangeListener(this);
-}
-
-/*
- * Contribute the local tools bar and the pull-down menu to the action bars.
- */
-void contributeToActionBars() {
-	IActionBars bars = getViewSite().getActionBars();
-	fillLocalPullDown(bars.getMenuManager());
-	fillLocalToolBar(bars.getToolBarManager());
-}
-
-@Override
-public void createPartControl(Composite parent) {
-
-	// Create the tab folder
-	this.shell = parent.getShell ();
-	this.tabFolder = new CTabFolder(parent, SWT.BORDER);
-
-	// Add results view as listener to viewer selection changes
-	Display.getDefault().asyncExec(() -> {
-  	PerformancesView performancesView = (PerformancesView) PerformancesView.getWorkbenchView("org.eclipse.test.internal.performance.results.ui.ComponentsView");
-  	if (performancesView != null) {
-  		performancesView.viewer.addSelectionChangedListener(BuildsComparisonView.this);
-  	}
-  });
-
-	// Set actions
-	PlatformUI.getWorkbench().getHelpSystem().setHelp(this.tabFolder, "org.eclipse.test.performance.ui.results");
-	makeActions();
-	contributeToActionBars();
-
-	// Restore state
-	restoreState();
-
-	// Create tabs
-	createTabs();
-
-	// Set selections (tab and line)
-	this.tabFolder.setSimple(false);
-}
-
-/*
- * Create the tab folder pages. There's one tab per performance machine.
- * The list of these machines is got from the DB_Results contants.
- */
-void createTabs() {
-	if (this.currentBuild == null || this.referenceBuild == null) return;
-	PerformanceResultsElement performanceResultsElement = getBuildsView().results;
-	String[] components = performanceResultsElement.getComponents();
-	int length = components.length;
-	this.tabs = new BuildsComparisonTab[length];
-	for (int i=0; i<length; i++) {
-		this.tabs[i] = new BuildsComparisonTab(components[i]);
-	}
-	for (BuildsComparisonTab tab : this.tabs) {
-		CTabItem item = new CTabItem (this.tabFolder, SWT.NONE);
-		item.setText (tab.getTabText ());
-		item.setControl (tab.createTabFolderPage(this));
-		item.setData (tab);
-	}
-	this.tabFolder.setSelection(0);
-}
-
-@Override
-public void dispose() {
-	this.tabFolder.dispose();
-	int length = this.tabs==null ? 0 : this.tabs.length;
-	for (int i=0; i<length; i++) {
-		this.tabs[i].dispose();
-	}
-	super.dispose();
-}
-
-/*
- * Fill the filters drop-down menu with:
- * 	- filter non-milestone builds
- *	- filter non-fingerprint scenarios
- */
-void fillFiltersDropDown(IMenuManager manager) {
-	manager.add(this.filterAdvancedScenarios);
-}
-
-/*
- * Fill the local pull down menu.
- */
-void fillLocalPullDown(IMenuManager manager) {
-	MenuManager filtersManager= new MenuManager("Filters");
-	fillFiltersDropDown(filtersManager);
-	manager.add(filtersManager);
-}
-
-/*
- * Fill the local tool bar with:
- * 	- change line selection display
- */
-void fillLocalToolBar(IToolBarManager manager) {
-	manager.add(this.writeComparison);
-}
-
-/*
- * Return the components results view.
- */
-PerformanceResultsElement getResults() {
-	if (this.results == null) {
-		this.results = getBuildsView().results;
-	}
-	return this.results;
-}
-
-/*
- * Return the components results view.
- */
-BuildsView getBuildsView() {
-	if (this.buildsView == null) {
-		this.buildsView = (BuildsView) PerformancesView.getWorkbenchView("org.eclipse.test.internal.performance.results.ui.BuildsView");
-	}
-	return this.buildsView;
-}
-
-@Override
-public void init(IViewSite site, IMemento memento) throws PartInitException {
-	super.init(site, memento);
-	this.viewState = memento;
-}
-
-/*
- * Make the actions of the view:
- * 	- change table line selection display
- * 	- filter non-milestone builds
- *	- filter non-fingerprint scenarios
- */
-void makeActions() {
-
-	// Filter non-fingerprints action
-  this.filterAdvancedScenarios = new Action("Advanced &Scenarios", IAction.AS_CHECK_BOX) {
-
-    @Override
-    public void run() {
-      BuildsComparisonView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, isChecked());
-      resetTabFolders();
-    }
-  };
-	this.filterAdvancedScenarios.setChecked(true);
-	this.filterAdvancedScenarios.setToolTipText("Filter advanced scenarios (i.e. not fingerprint ones)");
-
-	// Write comparison
-	this.writeComparison = new Action("Write comparison") {
-		@Override
-    public void run() {
-
-			// Get write directory
-			BuildsView bView = getBuildsView();
-			String filter = (bView.resultsDir == null) ? null : bView.resultsDir.getPath();
-			final File writeDir = bView.changeDir(filter, "Select a directory to write the comparison between two builds");
-			if (writeDir != null) {
-				writeComparison(writeDir);
-			}
-        }
-	};
-	this.writeComparison.setEnabled(false);
-	this.writeComparison.setToolTipText("Write comparison between two builds");
-}
-
-@Override
-public void preferenceChange(PreferenceChangeEvent event) {
-	String propertyName = event.getKey();
-	Object newValue = event.getNewValue();
-
-	// Filter non-fingerprints change
-	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS : "true".equals(newValue);
-		this.filterAdvancedScenarios.setChecked(checked);
-		resetTabFolders();
-	}
-}
-
-/*
- * Reset the table tab folders by re-create all the pages.
- * Selections are set onto the first found error if this is the first tab creation (typically on a component change event from the ComponentsView)
- * or to the previous one if this is just a refresh.
- */
-void resetTabFolders() {
-
-	// Store current indexes
-	int tabIndex = this.tabFolder.getSelectionIndex();
-	int lineIndex = tabIndex<0 ? -1 : this.tabs[tabIndex].table.getSelectionIndex();
-
-	// Create tab folders
-	CTabItem[] tabItems = this.tabFolder.getItems();
-	int length = tabItems.length;
-	if (length == 0) {
-		createTabs();
-	} else {
-		for (int i=0; i<length; i++) {
-			tabItems[i].setControl(this.tabs [i].createTabFolderPage(this));
-		}
-	}
-
-	// Set part name
-	setPartName(this.currentBuild+" vs. "+this.referenceBuild);
-
-	// Set the selection
-	if (tabIndex >= 0 && lineIndex >= 0) {
-		this.tabFolder.setSelection(tabIndex);
-		Table table = this.tabs[tabIndex].table;
-		table.setSelection(lineIndex);
-	}
-}
-
-/*
- * Restore the view state from the memento information.
- */
-void restoreState() {
-
-	// Filter non fingerprints action state
-	boolean checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
-	this.filterAdvancedScenarios.setChecked(checked);
-}
-
-@Override
-public void selectionChanged(SelectionChangedEvent event) {
-	final Object[] selection = ((TreeSelection) event.getSelection()).toArray();
-	String firstBuildResults = null;
-	String secondBuildResults = null;
-	if (selection.length == 2) {
-		this.tabFolder.setVisible(true);
-		if (selection[0] instanceof BuildResultsElement) {
-			firstBuildResults = ((BuildResultsElement) selection[0]).getName();
-		}
-		if (selection[1] instanceof BuildResultsElement) {
-			secondBuildResults = ((BuildResultsElement) selection[1]).getName();
-		}
-		if ((firstBuildResults != null && !firstBuildResults.equals(this.currentBuild)) || (secondBuildResults != null && !secondBuildResults.equals(this.referenceBuild))) {
-			this.currentBuild = firstBuildResults;
-			this.referenceBuild = secondBuildResults;
-			resetTabFolders();
-		}
-		this.writeComparison.setEnabled(true);
-	} else {
-		this.writeComparison.setEnabled(false);
-		this.tabFolder.setVisible(false);
-	}
-}
-
-@Override
-public void setFocus() {
-	// do nothing
-}
-
-protected void writeComparison(File writeDir) {
-	getBuildsView().resultsDir = writeDir;
-	writeDir = new File(writeDir, "values");
-	if (this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, false)) {
-		writeDir = new File(writeDir, "fingerprints");
-	} else {
-		writeDir = new File(writeDir, "all");
-	}
-	writeDir.mkdirs();
-	String buildDate = this.currentBuild.substring(1);
-	String buildPrefix = "Comparison" + buildDate + "_" + this.currentBuild.charAt(0);
-	File resultsFile = new File(writeDir, buildPrefix+".html");
-	if (resultsFile.exists()) {
-		int i=0;
-		File saveDir = new File(writeDir, "save");
-		saveDir.mkdir();
-		while (true) {
-			String newFileName = buildPrefix+"_";
-			if (i<10) newFileName += "0";
-			newFileName += i;
-			File renamedFile = new File(saveDir, newFileName+".html");
-			if (resultsFile.renameTo(renamedFile)) {
-				break;
-			}
-			i++;
-		}
-	}
-	this.results.writeComparison(resultsFile, this.currentBuild, this.referenceBuild);
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsView.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsView.java
deleted file mode 100644
index 19fdc8c..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsView.java
+++ /dev/null
@@ -1,813 +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.ui;
-
-
-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.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.test.internal.performance.results.db.DB_Results;
-import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
-import org.eclipse.test.internal.performance.results.model.ResultsElement;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-import org.eclipse.test.performance.ui.GenerateResults;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-
-/**
- * View to see all the builds which have performance results stored in the database.
- * <p>
- * Typical actions from this view are update local data files with builds results
- * and generated the HTML pages.
- * </p>
- */
-public class BuildsView extends PerformancesView {
-
-	/**
-	 * Action to generate results.
-	 */
-	final class GenerateAction extends Action {
-		IStatus status;
-
-		@Override
-    public void run() {
-
-			// Ask for output directory
-			String resultGenerationDir = BuildsView.this.preferences.get(IPerformancesConstants.PRE_RESULTS_GENERATION_DIR, "");
-			String pathFilter = (BuildsView.this.outputDir == null) ? resultGenerationDir : BuildsView.this.outputDir.getPath();
-			File dir = changeDir(pathFilter, "Select directory to write comparison files");
-			if (dir == null) {
-				return;
-			}
-			BuildsView.this.outputDir = dir;
-			BuildsView.this.preferences.put(IPerformancesConstants.PRE_RESULTS_GENERATION_DIR, dir.getAbsolutePath());
-
-			// Select the reference
-			String[] baselines = BuildsView.this.results.getBaselines();
-			int bLength = baselines.length;
-			String selectedBaseline;
-			switch (bLength) {
-				case 0:
-					// no baseline, nothing to do...
-					selectedBaseline = BuildsView.this.results.getPerformanceResults().getBaselineName();
-					break;
-				case 1:
-					// only one baseline, no selection to do
-					selectedBaseline = baselines[0];
-					break;
-				default:
-					// select the baseline from list
-					ElementListSelectionDialog dialog = new ElementListSelectionDialog(getSite().getShell(), new LabelProvider());
-					dialog.setTitle(getTitleToolTip());
-					dialog.setMessage("Select the baseline to use while generating results:");
-					Object[] defaultBaseline = new String[] { baselines[baselines.length - 1] };
-					dialog.setInitialSelections(defaultBaseline);
-					dialog.setElements(baselines);
-					dialog.open();
-					Object[] selected = dialog.getResult();
-					if (selected == null)
-						return;
-					selectedBaseline = (String) selected[0];
-					break;
-			}
-			final String baselineName = selectedBaseline;
-			BuildsView.this.results.getPerformanceResults().setBaselineName(baselineName);
-
-			// Ask for fingerprints
-			final boolean fingerprints = MessageDialog.openQuestion(BuildsView.this.shell, getTitleToolTip(), "Generate only fingerprints?");
-
-			// Generate all selected builds
-			IRunnableWithProgress runnable = monitor -> {
-      	try {
-      		monitor.beginTask("Generate performance results", BuildsView.this.buildsResults.length*2);
-      		generate(baselineName, fingerprints, monitor);
-      		monitor.done();
-      	} catch (Exception e) {
-      		e.printStackTrace();
-      	}
-      };
-			ProgressMonitorDialog readProgress = new ProgressMonitorDialog(getSite().getShell());
-			try {
-				readProgress.run(true, true, runnable);
-			} catch (InvocationTargetException e) {
-				// skip
-			} catch (InterruptedException e) {
-				// skip
-			}
-
-		}
-
-		void generate(final String baselineName, final boolean fingerprints, IProgressMonitor monitor) {
-
-			// Generate result for the build
-			GenerateResults generation = new GenerateResults(fingerprints, BuildsView.this.dataDir);
-
-			// Loop on selected builds
-			final String lastBuildName = BuildsView.this.lastBuild == null ? DB_Results.getLastCurrentBuild() : BuildsView.this.lastBuild;
-			String previousBuild = lastBuildName;
-			int length = BuildsView.this.buildsResults.length;
-			for (int i=0; i<length; i++) {
-
-				BuildResultsElement currentBuild = BuildsView.this.buildsResults[i];
-				String buildName = currentBuild.getName();
-				monitor.setTaskName("Generate perf results for build "+buildName);
-
-				// Create output directory
-				File genDir = new File(BuildsView.this.outputDir, buildName);
-				if (!genDir.exists() && !genDir.mkdir()) {
-					MessageDialog.openError(BuildsView.this.shell, getTitleToolTip(), "Cannot create " + genDir.getPath() + " to generate results!");
-					return;
-				}
-
-				// See if it's necessary to refresh data
-				if (!buildName.equals(previousBuild)) {
-					monitor.subTask("Get local data...");
-					BuildsView.this.results.readLocal(BuildsView.this.dataDir, null, buildName);
-					monitor.worked(1);
-				}
-
-				// Generate result for the build
-				GenerateAction.this.status = generation.run(BuildsView.this.results.getPerformanceResults(), buildName, baselineName, genDir, monitor);
-
-				// Store previous build
-				previousBuild = buildName;
-				if (monitor.isCanceled()) {
-					break;
-				}
-			}
-
-			// Refresh data if necessary
-			if (!lastBuildName.equals(previousBuild)) {
-				monitor.subTask("Put back local data for "+lastBuildName+"...");
-				BuildsView.this.results.readLocal(BuildsView.this.dataDir, null, BuildsView.this.lastBuild);
-				monitor.worked(1);
-			}
-
-			// Results
-			if (!this.status.isOK()) {
-				StringWriter swriter = new StringWriter();
-				PrintWriter pwriter = new PrintWriter(swriter);
-				swriter.write(this.status.getMessage());
-				Throwable ex = this.status.getException();
-				if (ex != null) {
-					swriter.write(": ");
-					swriter.write(ex.getMessage());
-					swriter.write('\n');
-					ex.printStackTrace(pwriter);
-				}
-				MessageDialog.open(this.status.getSeverity(),
-				    BuildsView.this.shell,
-				    getTitleToolTip(),
-				    swriter.toString(),
-				    SWT.NONE);
-			}
-		}
-	}
-
-	/**
-	 * Action to update local data files with the performance results of a build.
-	 *
-	 * This may be done lazily (i.e. not done if the local data already knows
-	 * the build) or forced (i.e. done whatever the local data files contain).
-	 */
-	class UpdateBuildAction extends Action {
-
-		boolean force;
-
-		UpdateBuildAction(boolean force) {
-			this.force = force;
-		}
-
-		@Override
-    public void run() {
-
-			// Verify that directories are set
-			if (BuildsView.this.dataDir == null) {
-				if (changeDataDir(null) == null) {
-					if (!MessageDialog.openConfirm(BuildsView.this.shell, getTitleToolTip(), "No local files directory is set, hence the update could not be written! OK to continue?")) {
-						return;
-					}
-				}
-			}
-
-			// Progress dialog
-			IRunnableWithProgress runnable = monitor -> {
-      	try {
-      		updateBuilds(monitor);
-      	} catch (Exception e) {
-      		e.printStackTrace();
-      	}
-      };
-			ProgressMonitorDialog readProgress = new ProgressMonitorDialog(getSite().getShell());
-			try {
-				readProgress.run(true, true, runnable);
-			} catch (InvocationTargetException e) {
-				return;
-			} catch (InterruptedException e) {
-				return;
-			}
-
-			// Reset Components and Builds views input
-			refreshInput();
-			getSiblingView().refreshInput();
-		}
-
-		void updateBuilds(IProgressMonitor monitor) {
-			BuildsView.this.updateBuilds(monitor, this.force);
-		}
-	}
-
-	/**
-	 * Action to update local data files with the performance results of all builds.
-	 *
-	 * This may be done lazily (i.e. not done if the local data already knows
-	 * the build) or forced (i.e. done whatever the local data files contain).
-	 */
-	class UpdateAllBuildsAction extends UpdateBuildAction {
-
-		UpdateAllBuildsAction(boolean force) {
-			super(force);
-		}
-//
-//		public boolean isEnabled() {
-//			String[] elements = buildsToUpdate();
-//			return elements != null;
-//		}
-
-		@Override
-    void updateBuilds(IProgressMonitor monitor) {
-			BuildsView.this.updateAllBuilds(monitor, this.force);
-		}
-	}
-
-	/**
-	 * Class to compare builds regarding their date instead of their name.
-	 *
-	 * @see Util#getBuildDate(String)
-	 */
-	class BuildDateComparator implements Comparator<String> {
-		@Override
-    public int compare(String s1, String s2) {
-	        return Util.getBuildDate(s1).compareTo(Util.getBuildDate(s2));
-	    }
-	}
-
-	// Views
-	ComponentsView componentsView;
-	BuildsComparisonView buildsComparisonView = null;
-
-	// Results model
-	BuildResultsElement[] buildsResults;
-	String lastBuild;
-
-	// Directories
-	File outputDir;
-
-	// Actions
-	Action generate;
-	UpdateBuildAction updateBuild, updateAllBuilds;
-//	UpdateBuildAction forceUpdateBuild, forceUpdateAllBuilds;
-	Action writeBuildsFailures;
-
-	// SWT resources
-	Font italicFont;
-
-/*
- * Default constructor.
- */
-public BuildsView() {
-	this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-	this.preferences.addPreferenceChangeListener(this);
-}
-
-/*
- * Compute the list of builds to update based on their status.
- */
-String[] buildsToUpdate() {
-	Object[] elements = this.results.getBuilds();
-	int length = elements.length;
-	String[] buildsToUpdate = new String[length];
-	int count = 0;
-	for (int i=0; i<length; i++) {
-		BuildResultsElement element = (BuildResultsElement) elements[i];
-		if (element.getStatus() == 0) {
-	        buildsToUpdate[count++] = element.getName();
-		}
-	}
-	if (count == 0) return null;
-	if (count < length) {
-		System.arraycopy(buildsToUpdate, 0, buildsToUpdate = new String[count], 0, count);
-	}
-	return buildsToUpdate;
-}
-
-@Override
-public void createPartControl(Composite parent) {
-	super.createPartControl(parent);
-
-	// Create the viewer
-	this.viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-
-	// Set the content provider: first level is builds list
-	WorkbenchContentProvider contentProvider = new WorkbenchContentProvider() {
-		@Override
-    public Object[] getElements(Object o) {
-			return getBuilds();
-		}
-	};
-	this.viewer.setContentProvider(contentProvider);
-
-	// Set the label provider
-	WorkbenchLabelProvider labelProvider = new WorkbenchLabelProvider() {
-
-		// Set an italic font when no local data have been read
-		@Override
-    public Font getFont(Object element) {
-			Font font = super.getFont(element);
-			if (element instanceof BuildResultsElement) {
-				if (((BuildResultsElement) element).isUnknown()) {
-					if (BuildsView.this.italicFont == null) {
-						FontData[] defaultFont = JFaceResources.getDefaultFont().getFontData();
-						FontData italicFontData = new FontData(defaultFont[0].getName(), defaultFont[0].getHeight(), SWT.ITALIC);
-						BuildsView.this.italicFont = new Font(DEFAULT_DISPLAY, italicFontData);
-					}
-					return BuildsView.this.italicFont;
-				}
-			}
-			return font;
-		}
-
-		// Set font in gray when no local data is available (i.e. local data needs to be updated)
-		@Override
-    public Color getForeground(Object element) {
-			Color color = super.getForeground(element);
-			if (element instanceof BuildResultsElement) {
-				if (!((BuildResultsElement) element).isRead()) {
-					color = DARK_GRAY;
-				}
-			}
-			return color;
-		}
-	};
-	this.viewer.setLabelProvider(labelProvider);
-
-	// Set the children sorter
-	ViewerComparator nameSorter = new ViewerComparator() {
-
-		// Sort children using specific comparison (see the implementation
-		// of the #compareTo(Object) in the ResultsElement hierarchy
-		@Override
-    public int compare(Viewer view, Object e1, Object e2) {
-			if (e1 instanceof ResultsElement && e2 instanceof ResultsElement) {
-				return ((ResultsElement) e2).compareTo((ResultsElement) e1);
-			}
-			return super.compare(view, e1, e2);
-		}
-	};
-	this.viewer.setComparator(nameSorter);
-
-	// Add results view as listener to viewer selection changes
-	Display.getDefault().asyncExec(() -> {
-  	ISelectionChangedListener listener = getComparisonView();
-  	if (listener != null) {
-  		BuildsView.this.viewer.addSelectionChangedListener(listener);
-  	}
-  });
-
-	// Finalize viewer initialization
-	PlatformUI.getWorkbench().getHelpSystem().setHelp(this.viewer.getControl(), "org.eclipse.test.performance.ui.builds");
-	finalizeViewerCreation();
-}
-
-@Override
-public void dispose() {
-	if (this.italicFont != null) {
-		this.italicFont.dispose();
-	}
-	super.dispose();
-}
-
-@Override
-void fillContextMenu(IMenuManager manager) {
-	super.fillContextMenu(manager);
-	manager.add(this.generate);
-	manager.add(this.updateBuild);
-//	manager.add(this.forceUpdateBuild);
-	manager.add(new Separator());
-	manager.add(this.writeBuildsFailures);
-}
-
-/*
- * Fill the local data drop-down menu
- */
-@Override
-void fillLocalDataDropDown(IMenuManager manager) {
-	super.fillLocalDataDropDown(manager);
-	manager.add(new Separator());
-	manager.add(this.updateAllBuilds);
-//	manager.add(this.forceUpdateAllBuilds);
-}
-
-/*
- * Get all builds from the model.
- */
-Object[] getBuilds() {
-	if (this.results == null) {
-//		initResults(this.lastBuild);
-		initResults();
-	}
-	return this.results.getBuilds();
-}
-
-/*
- * Return the components results view.
- */
-BuildsComparisonView getComparisonView() {
-	if (this.buildsComparisonView == null) {
-		this.buildsComparisonView = (BuildsComparisonView) getWorkbenchView("org.eclipse.test.internal.performance.results.ui.BuildsComparisonView");
-	}
-	return this.buildsComparisonView;
-}
-
-/*
- * Return the components view.
- */
-@Override
-PerformancesView getSiblingView() {
-	if (this.componentsView == null) {
-		this.componentsView = (ComponentsView) getWorkbenchView("org.eclipse.test.internal.performance.results.ui.ComponentsView");
-	}
-	return this.componentsView;
-}
-
-@Override
-void makeActions() {
-
-	super.makeActions();
-
-	// Generate action
-	this.generate = new GenerateAction();
-	this.generate.setText("&Generate");
-
-	// Update build actions
-	boolean connected = this.preferences.getBoolean(IPerformancesConstants.PRE_DATABASE_CONNECTION, IPerformancesConstants.DEFAULT_DATABASE_CONNECTION);
-	this.updateBuild = new UpdateBuildAction(false);
-	this.updateBuild.setText("&Update from DB");
-	this.updateBuild.setEnabled(connected);
-//	this.forceUpdateBuild = new UpdateBuildAction(true);
-//	this.forceUpdateBuild.setText("Force Update");
-
-	// Update build action
-	this.updateAllBuilds = new UpdateAllBuildsAction(false);
-	this.updateAllBuilds.setText("&Update from DB (all)");
-	this.updateAllBuilds.setEnabled(connected);
-//	this.forceUpdateAllBuilds = new UpdateAllBuildsAction(true);
-//	this.forceUpdateAllBuilds.setText("Force Update all");
-
-	// Write status
-	this.writeBuildsFailures = new Action("Write failures") {
-		@Override
-    public void run() {
-			String filter = (BuildsView.this.resultsDir == null) ? null : BuildsView.this.resultsDir.getPath();
-			final File writeDir = changeDir(filter, "Select a directory to write the files");
-			if (writeDir != null) {
-
-				// Create runnable
-				IRunnableWithProgress runnable = monitor -> {
-        	try {
-        		monitor.beginTask("Write failures", BuildsView.this.buildsResults.length*2);
-        		writeBuildsFailures(writeDir, monitor);
-        		monitor.done();
-        	} catch (Exception e) {
-        		e.printStackTrace();
-        	}
-        };
-
-				// Run with progress monitor
-				ProgressMonitorDialog readProgress = new ProgressMonitorDialog(getSite().getShell());
-				try {
-					readProgress.run(true, true, runnable);
-				} catch (InvocationTargetException e) {
-					// skip
-				} catch (InterruptedException e) {
-					// skip
-				}
-
-				// Refresh views
-				refreshInput();
-				getSiblingView().refreshInput();
-			}
-        }
-	};
-	this.writeBuildsFailures.setEnabled(true);
-	this.writeBuildsFailures.setToolTipText("Write component status to a file");
-
-	// Set filters default
-	this.filterBaselineBuilds.setChecked(false);
-}
-
-/**
- * Reset the views.
- */
-public void resetView() {
-
-	boolean debug = true;
-
-	// Look whether database constants has changed or not
-	int eclipseVersion = this.preferences.getInt(IPerformancesConstants.PRE_ECLIPSE_VERSION, IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
-	boolean connected = this.preferences.getBoolean(IPerformancesConstants.PRE_DATABASE_CONNECTION, IPerformancesConstants.DEFAULT_DATABASE_CONNECTION);
-	String databaseLocation = this.preferences.get(IPerformancesConstants.PRE_DATABASE_LOCATION, IPerformancesConstants.NETWORK_DATABASE_LOCATION);
-	if (debug) {
-		System.out.println("Reset View:");
-		System.out.println("	- eclispe version = "+eclipseVersion);
-		System.out.println("	- connected       = "+connected);
-		System.out.println("	- db location     = "+databaseLocation);
-	}
-	final boolean sameVersion = DB_Results.getDbVersion().endsWith(Integer.toString(eclipseVersion));
-	final boolean sameConnection = connected == DB_Results.DB_CONNECTION;
-	final boolean sameDB = sameVersion && databaseLocation.equals(DB_Results.getDbLocation());
-	if (debug) {
-		System.out.println("	- same version:    "+sameVersion);
-		System.out.println("	- same connection: "+sameConnection);
-		System.out.println("	- same DB:         "+sameDB);
-	}
-	final PerformancesView siblingView = getSiblingView();
-	if (sameConnection && sameDB) {
-		// No database preferences has changed do nothing
-		return;
-	}
-
-	// Update database constants
-	boolean updated = DB_Results.updateDbConstants(connected, eclipseVersion, databaseLocation);
-	if (debug) {
-		System.out.println("	- updated:         "+updated);
-	}
-	if (!connected) {
-		if (!updated) {
-			MessageDialog.openError(this.shell, getTitleToolTip(), "Error while updating database results constants!\nOpen error log to see more details on this error");
-		}
-	} else if (updated) {
-		StringBuilder message = new StringBuilder("Database connection has been correctly ");
-		message.append( connected ? "opened." : "closed.");
-		MessageDialog.openInformation(this.shell, getTitleToolTip(), message.toString());
-	} else {
-		MessageDialog.openError(this.shell, getTitleToolTip(), "The database connection cannot be established!\nOpen error log to see more details on this error");
-		DB_Results.updateDbConstants(false, eclipseVersion, databaseLocation);
-	}
-	setTitleToolTip();
-	siblingView.setTitleToolTip();
-
-	// Refresh view
-	if (sameVersion) {
-		// Refresh only builds view as the sibling view (Components) contents is based on local data files contents
-		this.results.resetBuildNames();
-		refreshInput();
-	} else {
-		// Reset views content
-		resetInput();
-		siblingView.resetInput();
-
-		// May be read local data now
-		if (MessageDialog.openQuestion(this.shell, getTitleToolTip(), "Do you want to read local data right now?")) {
-			changeDataDir(this.lastBuild);
-		} else {
-			this.dataDir = null;
-			siblingView.dataDir = null;
-		}
-	}
-
-	// Update actions
-	this.updateBuild.setEnabled(connected);
-	this.updateAllBuilds.setEnabled(connected);
-}
-
-@Override
-public void selectionChanged(SelectionChangedEvent event) {
-	super.selectionChanged(event);
-
-	// Update selected element
-	Object selection = this.viewer.getSelection();
-	int length = 0;
-	this.writeBuildsFailures.setEnabled(false);
-	if (selection instanceof IStructuredSelection) {
-		Object[] elements = ((IStructuredSelection)selection).toArray();
-		length = elements == null ? 0 : elements.length;
-		this.buildsResults = new BuildResultsElement[length];
-		if (length == 0) {
-			this.updateAllBuilds.setText("&Update from DB (all)");
-			return;
-		}
-		for (int i=0; i<length; i++) {
-		    if (elements == null) {
-		        throw new RuntimeException("elements was unexpected null. Programming error?");
-		    }
-			this.buildsResults[i] = (BuildResultsElement) elements[i];
-		}
-		this.writeBuildsFailures.setEnabled(true);
-	} else {
-		return;
-	}
-
-	// Update update build action
-//	boolean enableUpdateBuild = true;
-//	boolean enableGenerate = true;
-	int readBuilds = 0;
-	for (int i=0; i<length; i++) {
-		if (this.buildsResults[i].isRead()) {
-//			enableUpdateBuild = false;
-			readBuilds++;
-		} else {
-//			enableGenerate = false;
-		}
-	}
-//	this.updateBuild.setEnabled(enableUpdateBuild);
-//	this.forceUpdateBuild.setEnabled(!enableUpdateBuild);
-	final boolean force = readBuilds < length;
-	this.updateBuild.force = force;
-	this.updateAllBuilds.force = force;
-	this.updateAllBuilds.setText("&Update from DB");
-
-	// Update generate action
-	boolean enableGenerate = true;
-	if (enableGenerate) {
-		for (int i=0; i<length; i++) {
-			if (this.buildsResults[i].getName().startsWith(DB_Results.getDbBaselinePrefix())) {
-				enableGenerate = false;
-				break;
-			}
-		}
-	}
-	this.generate.setEnabled(enableGenerate);
-}
-
-void updateAllBuilds(IProgressMonitor monitor, boolean force) {
-	if (this.dataDir == null) {
-		changeDataDir(null);
-	}
-	String[] builds = buildsToUpdate();
-	if (builds == null) {
-		this.results.updateBuild(null, true, this.dataDir, monitor);
-	} else {
-		this.results.updateBuilds(builds, force, this.dataDir, monitor);
-	}
-}
-
-void updateBuilds(IProgressMonitor monitor, boolean force) {
-	if (this.dataDir == null) {
-		changeDataDir(null);
-	}
-	int length = this.buildsResults.length;
-	String[] builds = new String[length];
-	for (int i = 0; i < length; i++) {
-		builds[i] = this.buildsResults[i].getName();
-	}
-	this.results.updateBuilds(builds, force, this.dataDir, monitor);
-}
-
-protected void writeBuildsFailures(File writeDir, IProgressMonitor monitor) {
-
-	// Loop on selected builds
-	final String lastBuildName = this.lastBuild == null ? DB_Results.getLastCurrentBuild() : this.lastBuild;
-	String previousBuild = lastBuildName;
-	int length = this.buildsResults.length;
-	for (int i=0; i<length; i++) {
-
-		// See if it's necessary to refresh data
-		BuildResultsElement currentBuild = this.buildsResults[i];
-		String currentBuildName = currentBuild.getName();
-		monitor.setTaskName("Write failures for build "+currentBuildName);
-		if (!currentBuildName.equals(previousBuild)) {
-			monitor.subTask("Get local data...");
-			this.results.readLocal(this.dataDir, null, currentBuildName);
-			monitor.worked(1);
-		}
-
-		// Write the failures for the selected build
-		monitor.subTask("write file...");
-		writeFailures(writeDir, currentBuildName);
-		monitor.worked(1);
-
-		// Store previous build
-		previousBuild = currentBuildName;
-		if (monitor.isCanceled()) {
-			return;
-		}
-	}
-
-	// Refresh data if necessary
-	if (!lastBuildName.equals(previousBuild)) {
-		monitor.subTask("Put back local data for "+lastBuildName+"...");
-		this.results.readLocal(this.dataDir, null, this.lastBuild);
-		monitor.worked(1);
-	}
-}
-
-protected void writeFailures(File writeDir, String buildName) {
-
-	// Set the write directory
-	this.resultsDir = writeDir;
-	boolean filterAdvancedScenarios = 	this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
-	if (filterAdvancedScenarios) {
-		writeDir = new File(writeDir, "fingerprints");
-	} else {
-		writeDir = new File(writeDir, "all");
-	}
-	writeDir.mkdir();
-	int writeStatusValue = this.preferences.getInt(IPerformancesConstants.PRE_WRITE_STATUS, IPerformancesConstants.DEFAULT_WRITE_STATUS);
-	if ((writeStatusValue & IPerformancesConstants.STATUS_VALUES) != 0) {
-		writeDir = new File(writeDir, "values");
-	}
-	int buildsNumber = writeStatusValue & IPerformancesConstants.STATUS_BUILDS_NUMBER_MASK;
-	if (buildsNumber > 1) {
-		writeDir = new File(writeDir, Integer.toString(buildsNumber));
-	}
-	writeDir.mkdirs();
-
-	// Create the written file
-	String buildDate = buildName.substring(1);
-	String buildPrefix = buildDate + "_" + buildName.charAt(0);
-	File resultsFile = new File(writeDir, buildPrefix+".log");
-	File exclusionDir = new File(writeDir, "excluded");
-	exclusionDir.mkdir();
-	File exclusionFile = new File(exclusionDir, buildPrefix+".log");
-	if (resultsFile.exists()) {
-		int i=0;
-		File saveDir = new File(writeDir, "save");
-		saveDir.mkdir();
-		while (true) {
-			String newFileName = buildPrefix+"_";
-			if (i<10) newFileName += "0";
-			newFileName += i;
-			File renamedFile = new File(saveDir, newFileName+".log");
-			if (resultsFile.renameTo(renamedFile)) {
-				File renamedExclusionFile = new File(exclusionDir, newFileName+".log");
-				exclusionFile.renameTo(renamedExclusionFile);
-				break;
-			}
-			i++;
-		}
-	}
-
-	// Write status
-	StringBuilder excluded = this.results.writeFailures(resultsFile, writeStatusValue);
-	if (excluded == null) {
-		MessageDialog.openWarning(this.shell, getTitleToolTip(), "The component is not read, hence no results can be written!");
-	}
-
-	// Write exclusion file
-	try (DataOutputStream stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(exclusionFile)))){
-    if (excluded == null) {
-      throw new RuntimeException("excluded was unexpected null. Program error?");
-    }
-		stream.write(excluded.toString().getBytes());
-	} catch (FileNotFoundException e) {
-		System.err.println("Can't create exclusion file"+exclusionFile); //$NON-NLS-1$
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
-}
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentResultsView.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentResultsView.java
deleted file mode 100644
index bccfd90..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentResultsView.java
+++ /dev/null
@@ -1,422 +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.ui;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
-import org.eclipse.test.internal.performance.results.model.ComponentResultsElement;
-import org.eclipse.test.internal.performance.results.model.ConfigResultsElement;
-import org.eclipse.test.internal.performance.results.model.DimResultsElement;
-import org.eclipse.test.internal.performance.results.model.PerformanceResultsElement;
-import org.eclipse.test.internal.performance.results.model.ResultsElement;
-import org.eclipse.test.internal.performance.results.model.ScenarioResultsElement;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-
-/**
- * This view show for each performance machine the results of all builds
- * run since the beginning of the current version development.
- * <p>
- * Each machine results are show in a separate tab.
- * </p><p>
- * There's no real action available action from this view, only the possibility
- * to change how is displayed the line selection (full or only first column)
- * and also filter the results:
- * </p><ul>
- *	<li>Filter for builds:
- *		<ul>
- *		<li>Filter non-important builds:	hide all non-important builds, which means non-milestone builds and those after the last milestone</li>
- *		</ul>
- *	</li>
- *	<li>Filter for scenarios:
- *		<ul>
- *		<li>Filter non-fingerprints: hide the scenarios which are not in the fingerprints</li>
- *		</ul>
- *	</li>
- *	</ul>
- * <p>
- * Note that these filters are synchronized with the ones applied in the
- * {@link ComponentsView Components view}.
- * </p>
- *
- * @see ConfigTab Folder tab containing all the results for a configuration.
- */
-public class ComponentResultsView extends ViewPart implements ISelectionChangedListener, IPreferenceChangeListener {
-
-	// SWT resources
-	CTabFolder tabFolder;
-
-	// Model information
-	ConfigTab[] tabs;
-	ComponentResultsElement componentResultsElement;
-
-	// Action
-	Action fullLineSelection;
-	Action filterAdvancedScenarios;
-	Action filterOldBuilds;
-	ImageDescriptor fullSelectionImageDescriptor;
-
-	// Views
-	IMemento viewState;
-
-	// Eclipse preferences
-	IEclipsePreferences preferences;
-
-/*
- * Default constructor:
- * 	- create the image descriptor
- * 	- register the view as a properties listener
- */
-public ComponentResultsView() {
-	this.fullSelectionImageDescriptor = ImageDescriptor.createFromFile(getClass(), "icallout_obj.gif");
-	this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-	this.preferences.addPreferenceChangeListener(this);
-}
-
-/*
- * Contribute the local tools bar and the pull-down menu to the action bars.
- */
-void contributeToActionBars() {
-	IActionBars bars = getViewSite().getActionBars();
-	fillLocalPullDown(bars.getMenuManager());
-	fillLocalToolBar(bars.getToolBarManager());
-}
-
-@Override
-public void createPartControl(Composite parent) {
-
-	// Create the tab folder
-	this.tabFolder = new CTabFolder(parent, SWT.BORDER);
-
-	// Add results view as listener to viewer selection changes
-	Display.getDefault().asyncExec(() -> {
-  	PerformancesView performancesView = (PerformancesView) PerformancesView.getWorkbenchView("org.eclipse.test.internal.performance.results.ui.ComponentsView");
-  	if (performancesView != null) {
-  		performancesView.viewer.addSelectionChangedListener(ComponentResultsView.this);
-  	}
-  });
-
-	// Set actions
-	PlatformUI.getWorkbench().getHelpSystem().setHelp(this.tabFolder, "org.eclipse.test.performance.ui.results");
-	makeActions();
-	contributeToActionBars();
-
-	// Restore state
-	restoreState();
-
-	// Create tabs
-	createTabs();
-
-	// Set selections (tab and line)
-	this.tabFolder.setSimple(false);
-}
-
-/*
- * Create the tab folder pages. There's one tab per performance machine.
- * The list of these machines is got from the DB_Results contants.
- */
-void createTabs() {
-	if (this.componentResultsElement == null) return;
-	PerformanceResultsElement performanceResultsElement = (PerformanceResultsElement) this.componentResultsElement.getParent(null);
-	String[] configNames = performanceResultsElement.getConfigs();
-	String[] configDescriptions = performanceResultsElement.getConfigDescriptions();
-	int length = configNames.length;
-	this.tabs = new ConfigTab[length];
-	for (int i=0; i<length; i++) {
-		this.tabs[i] = new ConfigTab(configNames[i], configDescriptions[i]);
-	}
-	for (ConfigTab tab : this.tabs) {
-		CTabItem item = new CTabItem (this.tabFolder, SWT.NONE);
-		item.setText (tab.getTabText ());
-		item.setControl (tab.createTabFolderPage(this.componentResultsElement, this.tabFolder, this.fullLineSelection.isChecked()));
-		item.setData (tab);
-	}
-	this.tabFolder.setSelection(0);
-}
-
-@Override
-public void dispose() {
-	this.tabFolder.dispose();
-	int length = this.tabs==null ? 0 : this.tabs.length;
-	for (int i=0; i<length; i++) {
-		this.tabs[i].dispose();
-	}
-	JFaceResources.getResources().destroyImage(this.fullSelectionImageDescriptor);
-	super.dispose();
-}
-
-/*
- * Fill the filters drop-down menu with:
- * 	- filter non-milestone builds
- *	- filter non-fingerprint scenarios
- */
-void fillFiltersDropDown(IMenuManager manager) {
-	manager.add(this.filterOldBuilds);
-	manager.add(new Separator());
-	manager.add(this.filterAdvancedScenarios);
-}
-
-/*
- * Fill the local pull down menu.
- */
-void fillLocalPullDown(IMenuManager manager) {
-	MenuManager filtersManager= new MenuManager("Filters");
-	fillFiltersDropDown(filtersManager);
-	manager.add(filtersManager);
-}
-
-/*
- * Fill the local tool bar with:
- * 	- change line selection display
- */
-void fillLocalToolBar(IToolBarManager manager) {
-	manager.add(this.fullLineSelection);
-}
-
-@Override
-public void init(IViewSite site, IMemento memento) throws PartInitException {
-	super.init(site, memento);
-	this.viewState = memento;
-}
-
-/*
- * Make the actions of the view:
- * 	- change table line selection display
- * 	- filter non-milestone builds
- *	- filter non-fingerprint scenarios
- */
-void makeActions() {
-
-	// Full line selection action
-	this.fullLineSelection = new Action("", IAction.AS_CHECK_BOX) {
-		@Override
-    public void run() {
-			resetTabFolders(false/*refresh*/);
-		}
-	};
-	this.fullLineSelection.setImageDescriptor(this.fullSelectionImageDescriptor);
-	this.fullLineSelection.setToolTipText("Full line selection");
-//	this.fullLineSelection.setChecked(true);
-
-	// Filter non-fingerprints action
-	this.filterAdvancedScenarios = new Action("Advanced &Scenarios", IAction.AS_CHECK_BOX) {
-		@Override
-    public void run() {
-			ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, isChecked());
-			resetTabFolders(false/*refresh*/);
-        }
-	};
-	this.filterAdvancedScenarios.setChecked(true);
-	this.filterAdvancedScenarios.setToolTipText("Filter advanced scenarios (i.e. not fingerprint ones)");
-
-	// Filter non-important builds action
-	this.filterOldBuilds = new Action("&Old Builds", IAction.AS_CHECK_BOX) {
-		@Override
-    public void run() {
-			ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, isChecked());
-			resetTabFolders(false/*refresh*/);
-		}
-	};
-	this.filterOldBuilds.setChecked(false);
-	this.filterOldBuilds.setToolTipText("Filter old builds (i.e. before last milestone) but keep all previous milestones)");
-
-}
-
-@Override
-public void preferenceChange(PreferenceChangeEvent event) {
-	String propertyName = event.getKey();
-	Object newValue = event.getNewValue();
-
-	// Filter non-fingerprints change
-	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS : "true".equals(newValue);
-		this.filterAdvancedScenarios.setChecked(checked);
-		resetTabFolders(false/*refresh*/);
-	}
-
-	// Filter non-milestone change
-	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_OLD_BUILDS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS : "true".equals(newValue);
-		this.filterOldBuilds.setChecked(checked);
-		resetTabFolders(false/*refresh*/);
-	}
-
-}
-
-/*
- * Reset the table tab folders by re-create all the pages.
- * Selections are set onto the first found error if this is the first tab creation (typically on a component change event from the ComponentsView)
- * or to the previous one if this is just a refresh.
- */
-void resetTabFolders(boolean init) {
-
-	// Store current indexes
-	int tabIndex = this.tabFolder.getSelectionIndex();
-	int lineIndex = tabIndex<0 ? -1 : this.tabs[tabIndex].table.getSelectionIndex();
-
-	// Create tab folders
-	CTabItem[] tabItems = this.tabFolder.getItems();
-	int length = tabItems.length;
-	if (length == 0) {
-		createTabs();
-	} else {
-		for (int i=0; i<length; i++) {
-			tabItems[i].setControl(this.tabs [i].createTabFolderPage(this.componentResultsElement, this.tabFolder, this.fullLineSelection.isChecked()));
-		}
-	}
-
-	// Set the part name when possible
-	if (this.componentResultsElement != null) {
-		setPartName(Util.componentDisplayName(this.componentResultsElement.getName()));
-	}
-
-	// If this is the first display then look for the first error to set the selection on it
-	if (init)  {
-		if (this.componentResultsElement != null) {
-			// If the component has
-			if (this.componentResultsElement.hasError()) {
-				ResultsElement[] children = this.componentResultsElement.getChildren(); // get scenarios
-				int childrenLength = children.length;
-				for (int s=0; s<childrenLength; s++) {
-					if (children[s].hasError()) {
-						children = children[s].getChildren(); // get configs
-						for (int c=0; c<childrenLength; c++) {
-							if (children[c].hasError()) {
-								tabIndex = c;
-								break;
-							}
-						}
-						break;
-					}
-				}
-			}
-		}
-		lineIndex = 0;
-	}
-
-	// Set the selection
-	if (tabIndex >= 0 && lineIndex >= 0) {
-		this.tabFolder.setSelection(tabIndex);
-		Table table = this.tabs[tabIndex].table;
-		table.setSelection(lineIndex);
-	}
-}
-
-/*
- * Restore the view state from the memento information.
- */
-void restoreState() {
-
-	// Filter baselines action state
-	if (this.viewState != null) {
-		Boolean state = this.viewState.getBoolean(IPerformancesConstants.PRE_FULL_LINE_SELECTION);
-		boolean fullLine = state == null ? true : state.booleanValue();
-		this.fullLineSelection.setChecked(fullLine);
-	}
-
-	// Filter non fingerprints action state
-	boolean checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
-	this.filterAdvancedScenarios.setChecked(checked);
-
-	// Filter non important builds action state
-	checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS);
-	this.filterOldBuilds.setChecked(checked);
-}
-
-@Override
-public void saveState(IMemento memento) {
-	super.saveState(memento);
-	memento.putBoolean(IPerformancesConstants.PRE_FULL_LINE_SELECTION, this.fullLineSelection.isChecked());
-}
-
-@Override
-public void selectionChanged(SelectionChangedEvent event) {
-	ResultsElement selectedElement = (ResultsElement) ((TreeSelection) event.getSelection()).getFirstElement();
-	ComponentResultsElement componentElement = null;
-	ScenarioResultsElement scenarioResultsElement = null;
-	ConfigResultsElement configResultsElement = null;
-	BuildResultsElement buildResultsElement = null;
-	if (selectedElement instanceof ComponentResultsElement) {
-		componentElement = (ComponentResultsElement) selectedElement;
-	} else if (selectedElement instanceof ScenarioResultsElement) {
-		scenarioResultsElement = (ScenarioResultsElement) selectedElement;
-		componentElement = (ComponentResultsElement) scenarioResultsElement.getParent(null);
-	} else if (selectedElement instanceof ConfigResultsElement) {
-		configResultsElement = (ConfigResultsElement) selectedElement;
-		scenarioResultsElement = (ScenarioResultsElement) configResultsElement.getParent(null);
-		componentElement = (ComponentResultsElement) scenarioResultsElement.getParent(null);
-	} else if (selectedElement instanceof BuildResultsElement) {
-		buildResultsElement = (BuildResultsElement) selectedElement;
-		configResultsElement = (ConfigResultsElement) buildResultsElement.getParent(null);
-		scenarioResultsElement = (ScenarioResultsElement) configResultsElement.getParent(null);
-		componentElement = (ComponentResultsElement) scenarioResultsElement.getParent(null);
-	} else if (selectedElement instanceof DimResultsElement) {
-		buildResultsElement = (BuildResultsElement) selectedElement.getParent(null);
-		configResultsElement = (ConfigResultsElement) buildResultsElement.getParent(null);
-		scenarioResultsElement = (ScenarioResultsElement) configResultsElement.getParent(null);
-		componentElement = (ComponentResultsElement) scenarioResultsElement.getParent(null);
-	}
-	if (componentElement != this.componentResultsElement) {
-		this.componentResultsElement = componentElement;
-		if (componentElement == null || this.componentResultsElement.getChildren(null).length > 0) {
-			resetTabFolders(true);
-		}
-	}
-	if (configResultsElement != null) {
-		ConfigTab configTab = this.tabs[this.tabFolder.getSelectionIndex()];
-		if (!configResultsElement.getName().equals(configTab.configName)) {
-			int length = this.tabs.length;
-			for (int i=0; i<length; i++) {
-				if (this.tabs[i].configName.equals(configResultsElement.getName())) {
-					this.tabFolder.setSelection(i);
-				}
-			}
-		}
-		if (buildResultsElement != null) {
-			configTab = this.tabs[this.tabFolder.getSelectionIndex()];
-			configTab.select(buildResultsElement);
-		}
-	}
-}
-
-@Override
-public void setFocus() {
-	// do nothing
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentsView.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentsView.java
deleted file mode 100644
index dfe24bd..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ComponentsView.java
+++ /dev/null
@@ -1,368 +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.ui;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
-import org.eclipse.test.internal.performance.results.model.ComponentResultsElement;
-import org.eclipse.test.internal.performance.results.model.ConfigResultsElement;
-import org.eclipse.test.internal.performance.results.model.ResultsElement;
-import org.eclipse.test.internal.performance.results.model.ScenarioResultsElement;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * View to see the performance results of all the components in a hierarchical tree.
- * <p>
- * A component defines several performance scenarios which are run on several
- * machines (aka config). All builds results are stored onto each configuration
- * and 2 dimensions have been stored for each result: the "Elapsed Process Time"
- * and the "CPU Time".
- * </p><p>
- * There's only one available action from this view: read the local data files. This
- * populates the hierarchy with the numbers stored in these files.
- * </p><p>
- * There's also the possibility to filter the results:
- * </p><ul>
- *	<li>Filter for builds:
- *		<ul>
- *		<li>Filter baselines:	hide the baselines (starting with R-4.x)</li>
- *		<li>Filter non-important builds:	hide all non-important builds, which means non-milestone builds and those after the last milestone</li>
- *		</ul>
- *	</li>
- *	<li>Filter for scenarios:
- *		<ul>
- *		<li>Filter non-fingerprints: hide the scenarios which are not in the fingerprints</li>
- *		</ul>
- *	</li>
- *	</ul>
- * @see ComponentResultsView
- */
-public class ComponentsView extends PerformancesView {
-
-	// Viewer filters
-	final static ViewerFilter FILTER_ADVANCED_SCENARIOS = new ViewerFilter() {
-		@Override
-    public boolean select(Viewer v, Object parentElement, Object element) {
-			if (element instanceof ScenarioResultsElement) {
-				ScenarioResultsElement scenarioElement = (ScenarioResultsElement) element;
-				return scenarioElement.hasSummary();
-			}
-	        return true;
-        }
-	};
-
-	// Views
-	BuildsView buildsView;
-	ComponentResultsView componentResultsView = null;
-
-	// Internal
-	Set<ResultsElement> expandedComponents = new HashSet<>();
-
-	// Actions
-	Action filterAdvancedScenarios;
-
-	// SWT resources
-	Font boldFont;
-
-/**
- * Default constructor.
- */
-public ComponentsView() {
-	// Get preferences
-	this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-}
-
-@Override
-public void createPartControl(Composite parent) {
-	super.createPartControl(parent);
-
-	// Create the viewer
-	this.viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-
-	// Set the content provider: first level is components list
-	WorkbenchContentProvider contentProvider = new WorkbenchContentProvider() {
-		@Override
-    public Object[] getElements(Object o) {
-			return ComponentsView.this.getElements();
-		}
-	};
-	this.viewer.setContentProvider(contentProvider);
-
-	// Set the label provider
-	WorkbenchLabelProvider labelProvider = new WorkbenchLabelProvider() {
-
-		@Override
-    protected String decorateText(String input, Object element) {
-			return super.decorateText(input, element);
-		}
-
-		// When all scenarios are displayed, then set fingerprints one in bold.
-		@Override
-    public Font getFont(Object element) {
-			Font font = super.getFont(element);
-			if (element instanceof ScenarioResultsElement) {
-				boolean fingerprints = ComponentsView.this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
-				if (!fingerprints) {
-					ScenarioResultsElement scenarioElement = (ScenarioResultsElement) element;
-					if (scenarioElement.hasSummary()) {
-						return getBoldFont(font);
-					}
-				}
-			}
-			return font;
-		}
-	};
-	this.viewer.setLabelProvider(labelProvider);
-
-	// Set the children sorter
-	ViewerComparator nameSorter = new ViewerComparator() {
-
-		// Sort children using specific comparison (see the implementation
-		// of the #compareTo(Object) in the ResultsElement hierarchy
-		@Override
-    public int compare(Viewer view, Object e1, Object e2) {
-			// Config and Build results are sorted in reverse order
-			if (e1 instanceof BuildResultsElement) {
-				ResultsElement element = (ResultsElement) e2;
-				return element.compareTo((ResultsElement) e1);
-			}
-			if (e1 instanceof ResultsElement) {
-				ResultsElement element = (ResultsElement) e1;
-				return element.compareTo((ResultsElement) e2);
-			}
-			return super.compare(view, e1, e2);
-		}
-	};
-	this.viewer.setComparator(nameSorter);
-
-	// Add results view as listener to viewer selection changes
-	Display.getDefault().asyncExec(() -> {
-  	ISelectionChangedListener listener = getResultsView();
-  	if (listener != null) {
-  		ComponentsView.this.viewer.addSelectionChangedListener(listener);
-  	}
-  });
-
-	// Finalize viewer initialization
-	PlatformUI.getWorkbench().getHelpSystem().setHelp(this.viewer.getControl(), "org.eclipse.test.performance.ui.components");
-	finalizeViewerCreation();
-}
-
-@Override
-public void dispose() {
-	if (this.boldFont != null) {
-		this.boldFont.dispose();
-	}
-	super.dispose();
-}
-
-@Override
-void fillFiltersDropDown(IMenuManager manager) {
-	super.fillFiltersDropDown(manager);
-	manager.add(this.filterOldBuilds);
-	manager.add(new Separator());
-	manager.add(this.filterAdvancedScenarios);
-}
-
-/*
- * Filter non fingerprints scenarios action run.
- */
-void filterAdvancedScenarios(boolean fingerprints) {
-	this.results.setFingerprints(fingerprints);
-	if (fingerprints) {
-		this.viewFilters.add(FILTER_ADVANCED_SCENARIOS);
-	} else {
-		this.viewFilters.remove(FILTER_ADVANCED_SCENARIOS);
-	}
-	this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, fingerprints);
-	updateFilters();
-}
-
-/*
- * Returns the bold font.
- */
-Font getBoldFont(Font font) {
-	if (this.boldFont == null) {
-		FontData[] fontData = (font==null ? JFaceResources.getDefaultFont() : font).getFontData();
-		FontData boldFontData = new FontData(fontData[0].getName(), fontData[0].getHeight(), SWT.BOLD);
-		this.boldFont = new Font(this.display, boldFontData);
-	}
-	return this.boldFont;
-}
-
-/*
- * Get all the components from the model.
- */
-Object[] getElements() {
-	if (this.results == null) {
-		initResults();
-		if (this.filterAdvancedScenarios != null) {
-			this.results.setFingerprints(this.filterAdvancedScenarios.isChecked());
-		}
-	}
-	return this.results.getElements();
-}
-
-/*
- * Return the components results view.
- */
-ComponentResultsView getResultsView() {
-	if (this.componentResultsView == null) {
-		this.componentResultsView = (ComponentResultsView) getWorkbenchView("org.eclipse.test.internal.performance.results.ui.ComponentsResultsView");
-	}
-	return this.componentResultsView;
-}
-
-/*
- * Return the builds view.
- */
-@Override
-PerformancesView getSiblingView() {
-	if (this.buildsView == null) {
-		this.buildsView = (BuildsView) getWorkbenchView("org.eclipse.test.internal.performance.results.ui.BuildsView");
-	}
-	return this.buildsView;
-}
-
-@Override
-void makeActions() {
-
-	super.makeActions();
-
-	// Filter non-fingerprints action
-	this.filterAdvancedScenarios = new Action("Advanced &Scenarios", IAction.AS_CHECK_BOX) {
-		@Override
-    public void run() {
-			filterAdvancedScenarios(isChecked());
-        }
-	};
-	this.filterAdvancedScenarios.setChecked(true);
-	this.filterAdvancedScenarios.setToolTipText("Filter advanced scenarios (i.e. not fingerprint ones)");
-
-	// Set filters default
-	this.filterBaselineBuilds.setChecked(true);
-}
-
-@Override
-public void preferenceChange(PreferenceChangeEvent event) {
-	String propertyName = event.getKey();
-	Object newValue = event.getNewValue();
-
-	// Filter non-fingerprints change
-	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS : "true".equals(newValue);
-		filterAdvancedScenarios(checked);
-		this.filterAdvancedScenarios.setChecked(checked);
-	}
-
-	// Filter non-milestone change
-	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_OLD_BUILDS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS : "true".equals(newValue);
-		filterOldBuilds(checked);
-		this.filterOldBuilds.setChecked(checked);
-	}
-
-	super.preferenceChange(event);
-}
-
-@Override
-void restoreState() {
-	super.restoreState();
-
-	// Filter baselines action default
-	if (this.viewState == null) {
-		this.filterBaselineBuilds.setChecked(true);
-		this.viewFilters.add(FILTER_BASELINE_BUILDS);
-	}
-
-	// Filter non fingerprints action state
-	boolean checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
-	this.filterAdvancedScenarios.setChecked(checked);
-	if (checked) {
-		this.viewFilters.add(FILTER_ADVANCED_SCENARIOS);
-	}
-}
-
-@Override
-public void saveState(IMemento memento) {
-	super.saveState(memento);
-}
-
-/**
- * Select a results element in the tree.
- */
-public void select(ComponentResultsElement componentResults, String configName, String scenarioName, String buildName) {
-
-	// Collapse previous expanded components except the requested one
-	// TODO (frederic) also collapse expanded components children elements
-	this.expandedComponents.remove(componentResults);
-	Iterator<ResultsElement> iterator = this.expandedComponents.iterator();
-	while (iterator.hasNext()) {
-		this.viewer.collapseToLevel(iterator.next(), AbstractTreeViewer.ALL_LEVELS);
-	}
-	this.expandedComponents.clear();
-
-	// Set the tree selection
-	ScenarioResultsElement scenarioResultsElement = (ScenarioResultsElement) componentResults.getResultsElement(scenarioName);
-	if (scenarioResultsElement != null) {
-		ConfigResultsElement configResultsElement = (ConfigResultsElement) scenarioResultsElement.getResultsElement(configName);
-		if (configResultsElement != null) {
-			BuildResultsElement buildResultsElement = (BuildResultsElement) configResultsElement.getResultsElement(buildName);
-			if (buildResultsElement != null) {
-				this.viewer.setSelection(new StructuredSelection(buildResultsElement), true);
-				this.setFocus();
-			}
-		}
-	}
-}
-
-@Override
-public void selectionChanged(SelectionChangedEvent event) {
-	super.selectionChanged(event);
-	ResultsElement eventResultsElement = (ResultsElement) ((StructuredSelection)event.getSelection()).getFirstElement();
-	if (eventResultsElement != null) {
-		ResultsElement eventComponentElement = eventResultsElement;
-		if (!(eventComponentElement instanceof ComponentResultsElement)) {
-			while (!(eventComponentElement instanceof ComponentResultsElement)) {
-				eventComponentElement = (ResultsElement) eventComponentElement.getParent(null);
-			}
-			this.expandedComponents.add(eventComponentElement);
-		}
-	}
-}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ConfigTab.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ConfigTab.java
deleted file mode 100644
index 167be2a..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/ConfigTab.java
+++ /dev/null
@@ -1,590 +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.ui;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.ToolTip;
-import org.eclipse.test.internal.performance.results.db.AbstractResults;
-import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
-import org.eclipse.test.internal.performance.results.model.ComponentResultsElement;
-import org.eclipse.test.internal.performance.results.model.ConfigResultsElement;
-import org.eclipse.test.internal.performance.results.model.ResultsElement;
-import org.eclipse.test.internal.performance.results.model.ScenarioResultsElement;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
-
-/**
- * Tab to display all performances results numbers for a configuration (i.e a
- * performance machine).
- */
-public class ConfigTab {
-
-	// Colors
-	static final Display DEFAULT_DISPLAY = Display.getDefault();
-	static final Color BLUE = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_BLUE);
-	static final Color DARK_GREEN = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_DARK_GREEN);
-	static final Color GRAY = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_GRAY);
-	static final Color MAGENTA = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_MAGENTA);
-	static final Color RED = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_RED);
-
-	// SWT resources
-	Shell shell;
-	Display display;
-	Table table;
-	private GC gc;
-	private Color lightred;
-	private Color lightyellow;
-	private Color darkyellow;
-	private Color blueref;
-	private Font boldFont;
-	private Font italicFont;
-	private Font boldItalicFont;
-	Map<Point, ToolTip> toolTips;
-
-	// Information
-	String configBox, configName;
-	ComponentResultsElement results;
-	double[][] allValues;
-	double[][] allErrors;
-
-	// Cells management
-	Point tableOrigin, tableSize;
-	int columnsCount, rowsCount;
-	List<Object> firstLine;
-
-	// Eclipse preferences
-	private IEclipsePreferences preferences;
-
-	/*
-	 * Default constructor.
-	 */
-	public ConfigTab(String name, String box) {
-		this.configName = name;
-		int idx = box.indexOf(" (");
-		this.configBox = idx > 0 ? box.substring(0, idx) : box;
-		this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-	}
-
-	/**
-	 * Creates the tab folder page.
-	 *
-	 * @param tabFolder     org.eclipse.swt.widgets.TabFolder
-	 * @param fullSelection Tells whether the table should have a full line
-	 *                      selection or not
-	 * @return the new page for the tab folder
-	 */
-	Composite createTabFolderPage(ComponentResultsElement componentResultsElement, CTabFolder tabFolder,
-			boolean fullSelection) {
-		// Cache the shell and display.
-		this.shell = tabFolder.getShell();
-		this.display = this.shell.getDisplay();
-
-		// Remove old table is present
-		boolean initResources = this.table == null;
-		if (this.table != null) {
-			disposeTable();
-		}
-
-		// Store results
-		this.results = componentResultsElement;
-
-		// Create the "children" table
-		int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL;
-		if (fullSelection)
-			style |= SWT.FULL_SELECTION;
-		this.table = new Table(tabFolder, style);
-		this.table.setLinesVisible(true);
-		this.table.setHeaderVisible(true);
-		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
-		gridData.heightHint = 150;
-		this.table.setLayoutData(gridData);
-		this.gc = new GC(this.table);
-
-		// Init resources
-		if (initResources)
-			initResources();
-
-		// Add columns to the table
-		boolean fingerprints = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS,
-				IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
-		String[] columnHeaders = getLayoutDataFieldNames(fingerprints);
-		int length = columnHeaders.length;
-		for (int i = 0; i < length; i++) {
-			TableColumn column = new TableColumn(this.table, SWT.CENTER);
-			column.setText(columnHeaders[i]);
-		}
-
-		// Add lines to the table
-		this.toolTips = new HashMap<>();
-		fillTableLines(fingerprints);
-
-		// Updated columns
-		for (int i = 0; i < length; i++) {
-			TableColumn column = this.table.getColumn(i);
-			column.setWidth(i == 0 ? 120 : 100);
-			if (i > 0) {
-				String text = (String) this.firstLine.get(i);
-				column.setToolTipText(text);
-			}
-		}
-
-		// Store table info
-		this.columnsCount = length;
-
-		// Listen to mouse events to select the corresponding build in the components
-		// view
-		// when a click is done in the table cell.
-		final ComponentsView componentsView = (ComponentsView) PerformancesView
-				.getWorkbenchView("org.eclipse.test.internal.performance.results.ui.ComponentsView");
-		MouseListener mouseListener = MouseListener.mouseDownAdapter(e -> {
-			Point cellPosition = currentCellPosition(e.x, e.y);
-			Table tabTable = ConfigTab.this.table;
-			componentsView.select(ConfigTab.this.results, ConfigTab.this.configName,
-					(String) ConfigTab.this.firstLine.get(cellPosition.x), tabTable.getItem(cellPosition.y).getText());
-		}
-
-		);
-		this.table.addMouseListener(mouseListener);
-
-		// Listen to mouse track events to display the table cell corresponding tooltip.
-		MouseTrackListener mouseTrackListener = new MouseTrackListener() {
-
-			ToolTip currentTooltip;
-
-			@Override
-			public void mouseHover(MouseEvent e) {
-				if (this.currentTooltip != null) {
-					this.currentTooltip.setVisible(false);
-					this.currentTooltip = null;
-				}
-				Point cellPosition = currentCellPosition(e.x, e.y);
-				if (cellPosition != null) {
-					ToolTip tooltip = ConfigTab.this.toolTips.get(cellPosition);
-					if (tooltip != null) {
-						Point location = ConfigTab.this.table.toDisplay(new Point(e.x, e.y));
-						tooltip.setLocation(location);
-						tooltip.setVisible(true);
-						this.currentTooltip = tooltip;
-					}
-				}
-			}
-
-			@Override
-			public void mouseEnter(MouseEvent e) {
-			}
-
-			@Override
-			public void mouseExit(MouseEvent e) {
-			}
-		};
-		this.table.addMouseTrackListener(mouseTrackListener);
-
-		// Select the first line by default (as this is the current build)
-		this.table.select(0);
-
-		// Return the built composite
-		return this.table;
-	}
-
-	/*
-	 * Create and store a tooltip with the given information and at the given
-	 * position.
-	 */
-	void createToolTip(String toolTipText, String toolTipMessage, int toolTipStyle, Point position) {
-		ToolTip toolTip = new ToolTip(this.table.getShell(), toolTipStyle);
-		toolTip.setAutoHide(true);
-		toolTip.setText(toolTipText);
-		toolTip.setMessage(/* "("+col+","+row+") "+ */toolTipMessage);
-		this.toolTips.put(position, toolTip);
-	}
-
-	/*
-	 * Get the current cell position (column, row) from a point position.
-	 */
-	Point currentCellPosition(int x, int y) {
-
-		// Compute the origin of the visible area
-		if (this.tableOrigin == null) {
-			this.tableOrigin = new Point(0, this.table.getHeaderHeight());
-		}
-
-		// Increment width until over current y position
-		int height = this.tableOrigin.y;
-		int row = this.table.getTopIndex();
-		while (row < this.rowsCount && height < y) {
-			height += this.table.getItemHeight();
-			row++;
-		}
-		if (height < y) {
-			// return when position is over the last line
-			return null;
-		}
-		row--;
-
-		// Increment width until being over current x position
-		int col = 0;
-		TableItem tableItem = this.table.getItem(row);
-		Rectangle bounds = tableItem.getBounds(col);
-		while (col < this.columnsCount) {
-			int max = bounds.x + bounds.width + this.table.getGridLineWidth();
-			if (x <= max)
-				break;
-			if (col == this.columnsCount) {
-				// return when position is over the last column
-				return null;
-			}
-			col++;
-			bounds = tableItem.getBounds(col);
-		}
-
-		// Return the found table cell position
-		return new Point(col, row);
-	}
-
-	/*
-	 * Dispose all SWT resources.
-	 */
-	public void dispose() {
-		if (this.boldFont != null) {
-			this.boldFont.dispose();
-		}
-		if (this.italicFont != null) {
-			this.italicFont.dispose();
-		}
-		if (this.boldItalicFont != null) {
-			this.boldItalicFont.dispose();
-		}
-		if (this.darkyellow != null) {
-			this.darkyellow.dispose();
-		}
-		if (this.lightyellow != null) {
-			this.lightyellow.dispose();
-		}
-		if (this.lightred != null) {
-			this.lightred.dispose();
-		}
-		if (this.blueref != null) {
-			this.blueref.dispose();
-		}
-		disposeTable();
-	}
-
-	/*
-	 * Dispose all SWT controls associated with the table.
-	 */
-	private void disposeTable() {
-		if (this.toolTips != null) {
-			Iterator<Point> cells = this.toolTips.keySet().iterator();
-			while (cells.hasNext()) {
-				ToolTip toolTip = this.toolTips.get(cells.next());
-				toolTip.dispose();
-			}
-		}
-		this.table.dispose();
-		this.tableOrigin = null;
-		this.firstLine = null;
-	}
-
-	/*
-	 * Fill the lines of the tables. Get all the information from the model which
-	 * are returned in a list (lines) of lists (columns).
-	 */
-	private void fillTableLines(boolean fingerprints) {
-
-		// Get model information
-		if (this.results == null)
-			return;
-		List<List<Object>> differences = this.results.getConfigNumbers(this.configName, fingerprints);
-		if (differences == null)
-			return;
-
-		// Store first information line which are the scenarios full names
-		Iterator<List<Object>> lines = differences.iterator();
-		this.firstLine = lines.next();
-
-		// Read each information line (one line per build results)
-		Object[] scenarios = this.results.getChildren(null);
-		ConfigResultsElement[] configs = new ConfigResultsElement[scenarios.length];
-		int row = 0;
-		while (lines.hasNext()) {
-			List<Object> line = lines.next();
-			int size = line.size();
-
-			// The first column is the build name
-			String buildName = (String) line.get(0);
-			TableItem item = null;
-
-			// Set item if the line is not filtered
-			Font italic;
-			item = new TableItem(this.table, SWT.NONE);
-			item.setText(0, buildName);
-			italic = this.italicFont;
-
-			// Read each column value
-			String baselineName = null;
-			for (int col = 1; col < size; col++) {
-
-				// Reset tooltip info
-				String toolTipText = null;
-				String toolTipMessage = null;
-				int toolTipStyle = SWT.BALLOON;
-
-				// Otherwise get values for a scenario
-				Font italic2 = italic;
-				ScenarioResultsElement scenarioResultsElement = (ScenarioResultsElement) scenarios[col - 1];
-				if ((!fingerprints && scenarioResultsElement.hasSummary())) {
-					italic2 = this.boldItalicFont;
-					item.setFont(col, this.boldFont);
-				}
-				// Otherwise get values for a scenario
-				double[] values = (double[]) line.get(col);
-				if (values == AbstractResults.NO_BUILD_RESULTS) {
-					item.setText(col, "Missing");
-					item.setForeground(col, GRAY);
-					item.setFont(col, italic2);
-				} else if (values == AbstractResults.INVALID_RESULTS) {
-					item.setText(col, "Invalid");
-					item.setForeground(col, RED);
-					item.setFont(col, italic2);
-				} else {
-					// Get values array
-					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];
-
-					// Set text with delta value
-					item.setText(col, Util.PERCENTAGE_FORMAT.format(delta));
-
-					// Compute the tooltip to display on the cell
-					if (error > 0.03) {
-						// error is over the 3% threshold
-						item.setImage(col, ResultsElement.WARN_IMAGE);
-						item.setForeground(col, this.darkyellow);
-						toolTipText = "May be not reliable";
-						toolTipMessage = "The error on this result is " + Util.PERCENTAGE_FORMAT.format(error)
-								+ ", hence it may be not reliable";
-						toolTipStyle |= SWT.ICON_WARNING;
-					}
-					if (delta < -0.1) {
-						// delta < -10%: failure shown by an red-cross icon + text in red
-						item.setImage(col, ResultsElement.ERROR_IMAGE);
-						item.setForeground(col, RED);
-					} else if (delta < -0.05) {
-						// negative delta over 5% shown in red
-						item.setForeground(col, RED);
-					} else if (delta < 0) {
-						// negative delta shown in magenta
-						item.setForeground(col, MAGENTA);
-					} else if (delta > 0.2) {
-						// positive delta over 20% shown in green
-						item.setForeground(col, DARK_GREEN);
-					} else if (delta > 0.1) {
-						// positive delta between 10% and 20% shown in blue
-						item.setForeground(col, BLUE);
-					}
-
-					// Moderate the status if the build value or the difference is small
-					if (delta < 0) {
-						double diff = Math.abs(baselineValue - buildValue);
-						if (buildValue < 100 || diff < 100) {
-							if (toolTipText == null) {
-								toolTipText = "";
-							} else {
-								toolTipText += ", ";
-							}
-							toolTipText += "Small value";
-							if (toolTipMessage == null) {
-								toolTipMessage = "";
-							} else {
-								toolTipMessage += ".\n";
-							}
-							if (buildValue < 100) {
-								toolTipMessage += "This test has a small value (" + buildValue + "ms)";
-							} else {
-								toolTipMessage += "This test variation has a small value (" + diff + "ms)";
-							}
-							toolTipMessage += ", hence it may not be necessary to spend time on fixing this possible regression";
-							// set the text in italic
-							item.setFont(col, italic2);
-							toolTipStyle |= SWT.ICON_INFORMATION;
-						}
-					}
-
-					// Add information in tooltip when history shows big variation
-					ConfigResultsElement configResultsElement = configs[col - 1];
-					if (configResultsElement == null) {
-						configResultsElement = (ConfigResultsElement) scenarioResultsElement
-								.getResultsElement(this.configName);
-						configs[col - 1] = configResultsElement;
-					}
-					double deviation = configResultsElement == null ? 0 : configResultsElement.getStatistics()[3];
-					if (deviation > 0.2) {
-						// deviation is over 20% over the entire history
-						if (toolTipText == null) {
-							toolTipText = "";
-						} else {
-							toolTipText += ", ";
-						}
-						toolTipText += "History shows erratic values";
-						if (toolTipMessage == null) {
-							toolTipMessage = "";
-						} else {
-							toolTipMessage += ".\n";
-						}
-						toolTipMessage += "The results history shows that the variation of its delta is over 20% ("
-								+ Util.PERCENTAGE_FORMAT.format(deviation)
-								+ "), hence its result is surely not reliable";
-						// set the text in italic
-						item.setFont(col, italic2);
-						toolTipStyle |= SWT.ICON_INFORMATION;
-					} else if (deviation > 0.1) { // moderate the status when the test
-						// deviation is between 10% and 20% over the entire history
-						if (toolTipText == null) {
-							toolTipText = "";
-						} else {
-							toolTipText += ", ";
-						}
-						toolTipText += "History shows unstable values";
-						if (toolTipMessage == null) {
-							toolTipMessage = "";
-						} else {
-							toolTipMessage += ".\n";
-						}
-						toolTipMessage += "The results history shows that the variation of its delta is between 10% and 20% ("
-								+ Util.PERCENTAGE_FORMAT.format(deviation)
-								+ "), hence its result may not be really reliable";
-						// set the text in italic
-						item.setFont(col, italic2);
-						if (toolTipStyle == SWT.BALLOON && delta >= -0.1) {
-							toolTipStyle |= SWT.ICON_INFORMATION;
-						} else {
-							// reduce icon severity from error to warning
-							toolTipStyle |= SWT.ICON_WARNING;
-						}
-					}
-				}
-
-				// Set tooltip
-				if (toolTipText != null) {
-					createToolTip(toolTipText, toolTipMessage, toolTipStyle, new Point(col, row));
-				}
-
-				// Baseline name
-				ConfigResultsElement configResultsElement = (ConfigResultsElement) scenarioResultsElement
-						.getResultsElement(this.configName);
-				if (configResultsElement != null) {
-					String configBaselineName = configResultsElement.getBaselineBuildName(buildName);
-					if (baselineName == null) {
-						baselineName = configBaselineName;
-					} else if (baselineName.indexOf(configBaselineName) < 0) {
-						baselineName += ", " + configBaselineName;
-					}
-				}
-			}
-
-			// Set the tooltip over the build name
-			if (baselineName != null) {
-				createToolTip(buildName, "Baseline: " + baselineName, SWT.BALLOON | SWT.ICON_INFORMATION,
-						new Point(0, row));
-			}
-
-			// Increment row counter
-			row++;
-		}
-		this.rowsCount = row;
-	}
-
-	/*
-	 * Get the columns name.
-	 */
-	private String[] getLayoutDataFieldNames(boolean fingerprints) {
-		if (this.results == null) {
-			return new String[0];
-		}
-		List<String> labels = this.results.getScenariosLabels(fingerprints);
-		labels.add(0, "Build");
-		String[] names = new String[labels.size()];
-		labels.toArray(names);
-		return names;
-	}
-
-	/*
-	 * The tab text is the full machine name.
-	 */
-	public String getTabText() {
-		return this.configBox;
-	}
-
-	/*
-	 * Init the SWT resources
-	 */
-	private void initResources() {
-		// Fonts
-		String fontDataName = this.gc.getFont().getFontData()[0].toString();
-		FontData fdItalic = new FontData(fontDataName);
-		fdItalic.setStyle(SWT.ITALIC);
-		this.italicFont = new Font(this.display, fdItalic);
-		FontData fdBold = new FontData(fontDataName);
-		fdBold.setStyle(SWT.BOLD);
-		this.boldFont = new Font(this.display, fdBold);
-		FontData fdBoldItalic = new FontData(fontDataName);
-		fdBoldItalic.setStyle(SWT.BOLD | SWT.ITALIC);
-		this.boldItalicFont = new Font(this.display, fdBoldItalic);
-
-		// Colors
-		this.lightred = new Color(DEFAULT_DISPLAY, 220, 50, 50);
-		this.lightyellow = new Color(DEFAULT_DISPLAY, 255, 255, 160);
-		this.darkyellow = new Color(DEFAULT_DISPLAY, 160, 160, 0);
-		this.blueref = new Color(DEFAULT_DISPLAY, 200, 200, 255);
-	}
-
-	/*
-	 * Select the line corresponding to the given build.
-	 */
-	void select(BuildResultsElement buildResultsElement) {
-		int count = this.table.getItemCount();
-		String buildName = buildResultsElement.getName();
-		TableItem[] items = this.table.getItems();
-		for (int i = 0; i < count; i++) {
-			if (items[i].getText().endsWith(buildName)) {
-				this.table.deselect(this.table.getSelectionIndex());
-				this.table.select(i);
-				return;
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPerspective.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPerspective.java
deleted file mode 100644
index 7f7d2cd..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPerspective.java
+++ /dev/null
@@ -1,68 +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.ui;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- *  Defines the 'Performances' perspective.
- */
-public class PerformanceResultsPerspective implements IPerspectiveFactory {
-
-	private IPageLayout factory;
-
-@Override
-public void createInitialLayout(IPageLayout layout) {
-	this.factory = layout;
-	addViews();
-}
-
-/*
- * Add views to the perspective
- */
-private void addViews() {
-
-	// Component results view put on bottom
-	IFolderLayout bottom =
-		this.factory.createFolder(
-			"bottomRight", //NON-NLS-1
-			IPageLayout.BOTTOM,
-			0.5f,
-			this.factory.getEditorArea());
-	bottom.addView("org.eclipse.test.internal.performance.results.ui.ComponentsResultsView");
-	bottom.addView("org.eclipse.test.internal.performance.results.ui.BuildsComparisonView");
-
-	// Components and Builds view put on perspective top left
-	IFolderLayout topLeft =
-		this.factory.createFolder(
-			"topLeft", //NON-NLS-1
-			IPageLayout.LEFT,
-			0.5f,
-			this.factory.getEditorArea());
-	topLeft.addView("org.eclipse.test.internal.performance.results.ui.ComponentsView"); //NON-NLS-1
-	topLeft.addView("org.eclipse.test.internal.performance.results.ui.BuildsView"); //NON-NLS-1
-	topLeft.addView(IPageLayout.ID_PROJECT_EXPLORER); //NON-NLS-1
-
-	// Properties view put on perspective top right
-	IFolderLayout topRight =
-		this.factory.createFolder(
-			"topRight", //NON-NLS-1
-			IPageLayout.RIGHT,
-			0.5f,
-			this.factory.getEditorArea());
-	topRight.addView(IPageLayout.ID_PROP_SHEET); //NON-NLS-1
-
-	this.factory.setEditorAreaVisible(false);
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPreferencePage.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPreferencePage.java
deleted file mode 100644
index 98037fa..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPreferencePage.java
+++ /dev/null
@@ -1,998 +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.ui;
-
-import java.io.File;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.test.internal.performance.PerformanceTestPlugin;
-import org.eclipse.test.internal.performance.results.db.DB_Results;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.performance.ui.UiPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Defines the 'Performances' preferences page.
- */
-public class PerformanceResultsPreferencePage extends PreferencePage
-	implements IWorkbenchPreferencePage, SelectionListener, ModifyListener, IPerformancesConstants {
-
-	private Button mVersionRadioButton;
-	private Button dVersionRadionButton;
-	private CCombo databaseLocationCombo;
-	private Button dbConnectionCheckBox;
-	private Button dbLocalBrowseButton;
-	private Button dbRelengRadioButton;
-	private Button dbLocalRadioButton;
-	private CCombo defaultDimensionCombo;
-//	private CCombo lastBuildCombo;
-	private List resultsDimensionsList;
-	private Label dbLocationLabel;
-
-	// Status SWT objects
-	private Button statusValuesCheckBox;
-	private Button statusErrorNoneRadioButton;
-	private Button statusErrorNoticeableRadioButton;
-	private Button statusErrorSuspiciousRadioButton;
-	private Button statusErrorWeirdRadioButton;
-	private Button statusErrorInvalidRadioButton;
-	private Button statusSmallBuildValueCheckBox;
-	private Button statusSmallDeltaValueCheckBox;
-	private Button statusStatisticNoneRadioButton;
-	private Button statusStatisticErraticRadioButton;
-	private Button statusStatisticUnstableRadioButton;
-	private Text statusBuildsToConfirm;
-	private Text comparisonThresholdFailure;
-	private Text comparisonThresholdError;
-	private Text comparisonThresholdImprovement;
-
-	// TODO See whether config descriptors need to be set as preferences or not...
-	// private Table configDescriptorsTable;
-
-	private BuildsView buildsView;
-
-/**
- * Utility method that creates a push button instance and sets the default
- * layout data.
- *
- * @param parent
- *            the parent for the new button
- * @param label
- *            the label for the new button
- * @return the newly-created button
- */
-private Button createCheckBox(Composite parent, String label) {
-	Button button = new Button(parent, SWT.CHECK);
-	button.setText(label);
-	button.addSelectionListener(this);
-	GridData data = new GridData();
-	data.horizontalAlignment = GridData.FILL;
-	data.horizontalSpan = 5;
-	button.setLayoutData(data);
-	return button;
-}
-
-/**
- * Create a text field specific for this application
- *
- * @param parent
- *            the parent of the new text field
- * @return the new text field
- */
-private CCombo createCombo(Composite parent) {
-	CCombo combo= new CCombo(parent, SWT.BORDER);
-	combo.addModifyListener(this);
-	GridData data = new GridData();
-	data.horizontalSpan = 3;
-	data.horizontalAlignment = GridData.FILL;
-	data.grabExcessHorizontalSpace = true;
-	data.verticalAlignment = GridData.CENTER;
-	data.grabExcessVerticalSpace = false;
-	combo.setLayoutData(data);
-	return combo;
-}
-
-
-/**
- * Creates composite control and sets the default layout data.
- *
- * @param parent
- *            the parent of the new composite
- * @param numColumns
- *            the number of columns for the new composite
- * @param hSpan TODO
- * @return the newly-created coposite
- */
-private Composite createComposite(Composite parent, int numColumns, int hSpan) {
-	Composite composite = new Composite(parent, SWT.NULL);
-
-	// GridLayout
-	GridLayout layout = new GridLayout();
-	layout.numColumns = numColumns;
-	composite.setLayout(layout);
-
-	// GridData
-	GridData data = new GridData();
-	data.verticalAlignment = GridData.FILL;
-	data.horizontalAlignment = GridData.FILL;
-	data.horizontalSpan = hSpan;
-	composite.setLayoutData(data);
-	return composite;
-}
-
-@Override
-protected Control createContents(Composite parent) {
-
-	this.buildsView = (BuildsView) PerformancesView.getWorkbenchView("org.eclipse.test.internal.performance.results.ui.BuildsView");
-	if (this.buildsView == null) {
-		Label errorLabel = createLabel(parent, "No performances preferences can be set because the build view has not been created yet!", false);
-		errorLabel.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
-	} else {
-		// Eclipse version choice
-		Composite composite_eclipseVersion = createComposite(parent, 5, 1);
-		createLabel(composite_eclipseVersion, "Eclipse version", false);
-		Composite composite_versionChoice = createComposite(composite_eclipseVersion, 5, 1);
-		this.mVersionRadioButton = createRadioButton(composite_versionChoice, "v"+ECLIPSE_MAINTENANCE_VERSION);
-		this.dVersionRadionButton = createRadioButton(composite_versionChoice, "v"+ECLIPSE_DEVELOPMENT_VERSION);
-
-		// Database location
-		Composite compositeDatabase = createComposite(parent, 5, 1);
-		Group databaseGroup = createGroup(compositeDatabase, "Database", 5);
-		Composite compositeDatabaseConnection = createComposite(databaseGroup, 3, 5);
-		this.dbConnectionCheckBox = createCheckBox(compositeDatabaseConnection, "Connected");
-		this.dbRelengRadioButton = createRadioButton(compositeDatabaseConnection, "Releng");
-		this.dbLocalRadioButton = createRadioButton(compositeDatabaseConnection, "Local");
-		this.dbLocationLabel = createLabel(databaseGroup, "Location", false);
-		this.databaseLocationCombo = createCombo(databaseGroup);
-		this.databaseLocationCombo.setEditable(false);
-	    this.dbLocalBrowseButton = createPushButton(databaseGroup, "Browse");
-
-		// Status
-		Composite compositeStatus = createComposite(parent, 1, 3);
-		Group statusGroup = createGroup(compositeStatus, "Status", 1);
-		this.statusValuesCheckBox = createCheckBox(statusGroup, "Values");
-		this.statusValuesCheckBox.setToolTipText("Include numbers while writing status");
-		Group statusErrorGroup = createGroup(statusGroup, "Error level", 5);
-		statusErrorGroup.setToolTipText("Exclude from the written status failures depending on their build result error...");
-		this.statusErrorNoneRadioButton = createRadioButton(statusErrorGroup, "None");
-		this.statusErrorNoneRadioButton.setToolTipText("Do not exclude failures if they have a noticeable error");
-		this.statusErrorInvalidRadioButton = createRadioButton(statusErrorGroup, "Invalid");
-		this.statusErrorInvalidRadioButton.setToolTipText("Exclude all invalid failures (i.e. result error is over 100%)");
-		this.statusErrorWeirdRadioButton = createRadioButton(statusErrorGroup, "Weird");
-		this.statusErrorWeirdRadioButton.setToolTipText("Exclude all weird failures (i.e. result error is over 50%)");
-		this.statusErrorSuspiciousRadioButton = createRadioButton(statusErrorGroup, "Suspicious");
-		this.statusErrorSuspiciousRadioButton.setToolTipText("Exclude all suspicious failures (i.e. result error is over 25%)");
-		this.statusErrorNoticeableRadioButton = createRadioButton(statusErrorGroup, "Noticeable");
-		this.statusErrorNoticeableRadioButton.setToolTipText("Exclude all failures which have a noticeable error (i.e result error is over 3%)");
-		Group statusSmallGroup = createGroup(statusGroup, "Small value", 5);
-		statusErrorGroup.setToolTipText("Exclude from the written status failures depending on their value");
-		this.statusSmallBuildValueCheckBox = createCheckBox(statusSmallGroup, "Build value");
-		this.statusSmallBuildValueCheckBox.setToolTipText("Exclude all failures which have a build result value smaller than 100ms");
-		this.statusSmallDeltaValueCheckBox = createCheckBox(statusSmallGroup, "Delta value");
-		this.statusSmallDeltaValueCheckBox.setToolTipText("Exclude all failures which have a delta result value smaller than 100ms");
-		Group statusStatisticsGroup = createGroup(statusGroup, "Statistics", 5);
-		statusStatisticsGroup.setToolTipText("Exclude from the written status failures depending on build results statistics...");
-		this.statusStatisticNoneRadioButton = createRadioButton(statusStatisticsGroup, "None");
-		this.statusStatisticNoneRadioButton.setToolTipText("Do not exclude failures which have bad baseline results statistics (i.e. variation is over 10%)");
-		this.statusStatisticUnstableRadioButton = createRadioButton(statusStatisticsGroup, "Unstable");
-		this.statusStatisticUnstableRadioButton.setToolTipText("Exclude all failures which have unstable baseline results statistics (i.e. variation is between 10% and 20%)");
-		this.statusStatisticErraticRadioButton = createRadioButton(statusStatisticsGroup, "Erratic");
-		this.statusStatisticErraticRadioButton.setToolTipText("Exclude all failures which have erratic baseline results statistics (i.e. variation is over 20%)");
-		createLabel(statusGroup, "Builds to confirm:", false);
-		this.statusBuildsToConfirm = createTextField(statusGroup);
-		this.statusBuildsToConfirm.setToolTipText("The number of previous builds to take into account to confirm a regression");
-
-		// Comparison
-		Composite compositeComparison = createComposite(parent, 1, 3);
-		Group comparisonGroup = createGroup(compositeComparison, "Comparison", 1);
-		Group thresholdsGroup = createGroup(comparisonGroup, "Thresholds", 6);
-//		Composite compositeFailureThreshold = createComposite(comparisonGroup, 2, 2);
-		createLabel(thresholdsGroup, "Failure:", false);
-		this.comparisonThresholdFailure = createTextField(thresholdsGroup);
-		this.comparisonThresholdFailure.setToolTipText("The threshold in percentage to report a failure");
-		createLabel(thresholdsGroup, "Error:", false);
-		this.comparisonThresholdError = createTextField(thresholdsGroup);
-		this.comparisonThresholdError.setToolTipText("The threshold in percentage to report an error");
-		createLabel(thresholdsGroup, "Improvement:", false);
-		this.comparisonThresholdImprovement = createTextField(thresholdsGroup);
-		this.comparisonThresholdImprovement.setToolTipText("The threshold in percentage to report an improvement");
-
-		// Default dimension layout
-		StringBuilder tooltip = new StringBuilder("Select the default dimension which will be used for performance results\n");
-		tooltip.append("When changed, the new selected dimension is automatically added to the dimensions list below...");
-		String tooltipText = tooltip.toString();
-		Composite compositeDefaultDimension = createComposite(parent, 3, 1);
-		createLabel(compositeDefaultDimension, "Default dimension: ", false);
-		this.defaultDimensionCombo = createCombo(compositeDefaultDimension);
-		this.defaultDimensionCombo.setEditable(false);
-		this.defaultDimensionCombo.setToolTipText(tooltipText);
-
-		// Results dimensions layout
-		tooltip = new StringBuilder("Select the dimensions which will be used while generating performance results\n");
-		tooltip.append("When changed, the default dimension above is automatically added to the new list...");
-		tooltipText = tooltip.toString();
-		Composite compositeResultsDimensions = createComposite(parent, 3, 1);
-		createLabel(compositeResultsDimensions, "Results dimensions: ", true/*beginning*/);
-		this.resultsDimensionsList = createList(compositeResultsDimensions);
-		this.resultsDimensionsList.setToolTipText(tooltipText);
-
-		// Config descriptors layout
-		/* TODO See whether config descriptors need to be set as preferences or not...
-		Composite compositeConfigDescriptors = createComposite(parent, 3);
-		createLabel(compositeConfigDescriptors, "Config descriptors: ", false);
-		this.configDescriptorsTable = createTable(compositeConfigDescriptors);
-		TableColumn firstColumn = new TableColumn(this.configDescriptorsTable, SWT.LEFT);
-		firstColumn.setText ("Name");
-		firstColumn.setWidth(50);
-		TableColumn secondColumn = new TableColumn(this.configDescriptorsTable, SWT.FILL | SWT.LEFT);
-		secondColumn.setText ("Description");
-		secondColumn.setWidth(300);
-		*/
-
-		// init values
-		initializeValues();
-	}
-
-	// font = null;
-	Composite contents = new Composite(parent, SWT.NULL);
-	contents.pack(true);
-	return contents;
-}
-
-/**
- * Utility method that creates a label instance and sets the default layout
- * data.
- *
- * @param parent
- *            the parent for the new label
- * @param text
- *            the text for the new label
- * @return the new label
- */
-private Group createGroup(Composite parent, String text, int columns) {
-	Group group = new Group(parent, SWT.NONE);
-	group.setLayout(new GridLayout(columns, false));
-	group.setText(text);
-	GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
-//	data.horizontalSpan = 1;
-	group.setLayoutData(data);
-	return group;
-}
-
-/**
- * Utility method that creates a label instance and sets the default layout
- * data.
- *
- * @param parent
- *            the parent for the new label
- * @param text
- *            the text for the new label
- * @param beginning TODO
- * @return the new label
- */
-private Label createLabel(Composite parent, String text, boolean beginning) {
-	Label label = new Label(parent, SWT.BEGINNING|SWT.LEFT);
-	label.setText(text);
-	GridData data = new GridData();
-	data.horizontalAlignment = GridData.FILL;
-	data.verticalAlignment = beginning ? GridData.BEGINNING : GridData.CENTER;
-	label.setLayoutData(data);
-	return label;
-}
-
-/**
- * Create a text field specific for this application
- *
- * @param parent
- *            the parent of the new text field
- * @return the new text field
- */
-private List createList(Composite parent) {
-	List list = new List(parent, SWT.MULTI | SWT.BORDER);
-	list.addSelectionListener(this);
-	GridData data = new GridData();
-	data.horizontalSpan = 2;
-	data.horizontalAlignment = GridData.FILL;
-	data.grabExcessHorizontalSpace = true;
-	data.verticalAlignment = GridData.CENTER;
-	data.grabExcessVerticalSpace = false;
-	list.setLayoutData(data);
-	return list;
-}
-
-/**
- * Utility method that creates a push button instance and sets the default
- * layout data.
- *
- * @param parent
- *            the parent for the new button
- * @param label
- *            the label for the new button
- * @return the newly-created button
- */
-private Button createPushButton(Composite parent, String label) {
-	Button button = new Button(parent, SWT.PUSH);
-	button.setText(label);
-	button.addSelectionListener(this);
-	GridData data = new GridData();
-	data.horizontalAlignment = SWT.LEFT;
-	data.grabExcessHorizontalSpace = true;
-//	data.horizontalSpan = 2;
-	data.minimumWidth = 100;
-	button.setLayoutData(data);
-	return button;
-}
-
-/**
- * Utility method that creates a radio button instance and sets the default
- * layout data.
- *
- * @param parent
- *            the parent for the new button
- * @param label
- *            the label for the new button
- * @return the newly-created button
- */
-private Button createRadioButton(Composite parent, String label) {
-	Button button = new Button(parent, SWT.RADIO | SWT.LEFT);
-	button.setText(label);
-	button.addSelectionListener(this);
-	GridData data = new GridData();
-	button.setLayoutData(data);
-	return button;
-}
-
-/*
- * Create a text field specific for this application
- *
- * @param parent
- *            the parent of the new text field
- * @return the new text field
- *
-private Table createTable(Composite parent) {
-	Table table = new Table(parent, SWT.BORDER);
-	table.setLinesVisible (true);
-	table.setHeaderVisible (true);
-	GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
-	gridData.heightHint = 150;
-	table.setLayoutData(gridData);
-	return table;
-}
-*/
-
-/*
- * Create a text field specific for this application
- *
- * @param parent
- *            the parent of the new text field
- * @return the new text field
- */
-private Text createTextField(Composite parent) {
-	Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
-	text.addModifyListener(this);
-	GridData data = new GridData();
-	data.horizontalAlignment = GridData.FILL;
-	data.grabExcessHorizontalSpace = true;
-	data.verticalAlignment = GridData.CENTER;
-	data.grabExcessVerticalSpace = false;
-	text.setLayoutData(data);
-	return text;
-}
-
-/**
- * The <code>ReadmePreferencePage</code> implementation of this
- * <code>PreferencePage</code> method returns preference store that belongs to
- * the our plugin. This is important because we want to store our preferences
- * separately from the workbench.
- */
-@Override
-protected IPreferenceStore doGetPreferenceStore() {
-	return UiPlugin.getDefault().getPreferenceStore();
-}
-
-String getDialogTitle() {
-	String title = DB_Results.getDbTitle();
-	if (title == null) {
-		// DB is not connected
-		int version;
-		if (this.mVersionRadioButton.getSelection()) {
-			version = ECLIPSE_MAINTENANCE_VERSION;
-		} else {
-			version = ECLIPSE_DEVELOPMENT_VERSION;
-		}
-		title = "Eclipse " + version + " - DB not connected";
-	}
-	return title;
-}
-
-/*
- * Get the directory path using the given location as default.
- */
-private String getDirectoryPath(String location) {
-	DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN);
-	dialog.setText(getDialogTitle());
-	dialog.setMessage("Select local database directory:");
-	dialog.setFilterPath(location);
-	String path = dialog.open();
-	if (path != null) {
-		File dir = new File(path);
-		if (dir.exists() && dir.isDirectory()) {
-			return dir.getAbsolutePath();
-		}
-	}
-	return null;
-}
-
-@Override
-public void init(IWorkbench workbench) {
-	// do nothing
-}
-
-/*
- * Init he contents of the dimensions list controls.
- */
-void initDimensionsLists() {
-	// Dimensions lists
-	java.util.List<String> dimensions = PerformanceTestPlugin.getDimensions();
-	Iterator<String> names = dimensions.iterator();
-	while (names.hasNext()) {
-		String name = names.next();
-		this.defaultDimensionCombo.add(name);
-		this.resultsDimensionsList.add(name);
-	}
-}
-
-/**
- * Initializes states of the controls using default values in the preference
- * store.
- */
-private void initializeDefaults() {
-	IPreferenceStore store = getPreferenceStore();
-
-	// Init default database values
-	this.dbConnectionCheckBox.setSelection(store.getDefaultBoolean(PRE_DATABASE_CONNECTION));
-	this.dbRelengRadioButton.setSelection(false);
-	this.dbLocalRadioButton.setSelection(false);
-	final boolean dbLocal = store.getDefaultBoolean(PRE_DATABASE_LOCAL);
-	if (dbLocal) {
-		this.dbLocalRadioButton.setSelection(true);
-	} else {
-		this.dbRelengRadioButton.setSelection(true);
-	}
-	this.databaseLocationCombo.removeAll();
-	this.databaseLocationCombo.setText(store.getDefaultString(PRE_DATABASE_LOCATION));
-	updateDatabaseGroup();
-
-	// Init default status values
-	int writeStatus = store.getDefaultInt(PRE_WRITE_STATUS);
-	initStatusValues(writeStatus);
-
-	// Init comparison thresholds
-	this.comparisonThresholdFailure.setText(String.valueOf(store.getDefaultInt(PRE_COMPARISON_THRESHOLD_FAILURE)));
-	this.comparisonThresholdError.setText(String.valueOf(store.getDefaultInt(PRE_COMPARISON_THRESHOLD_ERROR)));
-	this.comparisonThresholdImprovement.setText(String.valueOf(store.getDefaultInt(PRE_COMPARISON_THRESHOLD_IMPROVEMENT)));
-
-	// Init eclipse version
-	this.mVersionRadioButton.setSelection(false);
-	this.dVersionRadionButton.setSelection(false);
-	int version = store.getDefaultInt(PRE_ECLIPSE_VERSION);
-	if (version == ECLIPSE_MAINTENANCE_VERSION) {
-		this.mVersionRadioButton.setSelection(true);
-	} else {
-		this.dVersionRadionButton.setSelection(true);
-	}
-    updateBrowseButtonToolTip(version);
-
-	// Init default default dimension
-	String defaultDimension = store.getDefaultString(PRE_DEFAULT_DIMENSION);
-	this.defaultDimensionCombo.setText(defaultDimension);
-
-	// Init default generated dimensions
-	this.resultsDimensionsList.add(store.getDefaultString(PRE_RESULTS_DIMENSION+".0"));
-	this.resultsDimensionsList.add(store.getDefaultString(PRE_RESULTS_DIMENSION+".1"));
-}
-
-/**
- * Initializes states of the controls from the preference store.
- */
-private void initializeValues() {
-	IPreferenceStore store = getPreferenceStore();
-
-	// Init database info
-	this.dbConnectionCheckBox.setSelection(store.getBoolean(PRE_DATABASE_CONNECTION));
-	final boolean dbLocal = store.getBoolean(PRE_DATABASE_LOCAL);
-	if (dbLocal) {
-		this.dbLocalRadioButton.setSelection(true);
-		this.dbRelengRadioButton.setToolTipText("");
-	} else {
-		this.dbRelengRadioButton.setSelection(true);
-		this.dbRelengRadioButton.setToolTipText(NETWORK_DATABASE_LOCATION);
-	}
-	this.databaseLocationCombo.removeAll();
-	this.databaseLocationCombo.setText(store.getString(PRE_DATABASE_LOCATION));
-	for (int i = 0; i < 3; i++) {
-		String history = store.getString(PRE_DATABASE_LOCATION + "." + i);
-		if (history.length() == 0)
-			break;
-		this.databaseLocationCombo.add(history);
-	}
-	updateDatabaseGroup();
-
-	// Init status values
-	int writeStatus = store.getInt(PRE_WRITE_STATUS);
-	initStatusValues(writeStatus);
-
-	// Init comparison thresholds
-	this.comparisonThresholdFailure.setText(String.valueOf(store.getInt(PRE_COMPARISON_THRESHOLD_FAILURE)));
-	this.comparisonThresholdError.setText(String.valueOf(store.getInt(PRE_COMPARISON_THRESHOLD_ERROR)));
-	this.comparisonThresholdImprovement.setText(String.valueOf(store.getInt(PRE_COMPARISON_THRESHOLD_IMPROVEMENT)));
-
-	// Init eclipse version
-	int version = store.getInt(PRE_ECLIPSE_VERSION);
-	if (version == ECLIPSE_MAINTENANCE_VERSION) {
-		this.mVersionRadioButton.setSelection(true);
-	} else {
-		this.dVersionRadionButton.setSelection(true);
-	}
-    updateBrowseButtonToolTip(version);
-
-	// Init composite lists
-	initDimensionsLists();
-
-	// Init default dimension
-	String defaultDimension = store.getString(PRE_DEFAULT_DIMENSION);
-	this.defaultDimensionCombo.setText(defaultDimension);
-
-	// Init generated dimensions
-	int count = this.resultsDimensionsList.getItemCount();
-	int[] indices = new int[count];
-	int n = 0;
-	String resultsDimension = store.getString(PRE_RESULTS_DIMENSION + "." + n);
-	while (resultsDimension.length() > 0) {
-		indices[n++] = this.resultsDimensionsList.indexOf(resultsDimension);
-		resultsDimension = store.getString(PRE_RESULTS_DIMENSION + "." + n);
-	}
-	if (n < count) {
-		System.arraycopy(indices, 0, indices = new int[n], 0, n);
-	}
-	this.resultsDimensionsList.select(indices);
-
-	// Init config descriptors
-	/* TODO See whether config descriptors need to be set as preferences or not...
-	this.configDescriptorsTable.clearAll();
-	int d = 0;
-	String descriptorName = store.getString(PRE_CONFIG_DESCRIPTOR_NAME + "." + d);
-	String descriptorDescription = store.getString(PRE_CONFIG_DESCRIPTOR_DESCRIPTION + "." + d++);
-	while (descriptorName.length() > 0) {
-		TableItem tableItem = new TableItem (this.configDescriptorsTable, SWT.NONE);
-		tableItem.setText (0, descriptorName);
-		tableItem.setText (1, descriptorDescription);
-		descriptorName = store.getString(PRE_CONFIG_DESCRIPTOR_NAME + "." + d);
-		descriptorDescription = store.getString(PRE_CONFIG_DESCRIPTOR_DESCRIPTION + "." + d++);
-	}
-	*/
-}
-
-private void initStatusValues(int writeStatus) {
-	this.statusValuesCheckBox.setSelection((writeStatus & STATUS_VALUES) != 0);
-	this.statusErrorNoneRadioButton.setSelection(false);
-	this.statusErrorNoticeableRadioButton.setSelection(false);
-	this.statusErrorSuspiciousRadioButton.setSelection(false);
-	this.statusErrorWeirdRadioButton.setSelection(false);
-	this.statusErrorInvalidRadioButton.setSelection(false);
-	switch (writeStatus & STATUS_ERROR_LEVEL_MASK) {
-		case STATUS_ERROR_NONE:
-			this.statusErrorNoneRadioButton.setSelection(true);
-			break;
-		case STATUS_ERROR_NOTICEABLE:
-			this.statusErrorNoticeableRadioButton.setSelection(true);
-			break;
-		case STATUS_ERROR_SUSPICIOUS:
-			this.statusErrorSuspiciousRadioButton.setSelection(true);
-			break;
-		case STATUS_ERROR_WEIRD:
-			this.statusErrorWeirdRadioButton.setSelection(true);
-			break;
-		case STATUS_ERROR_INVALID:
-			this.statusErrorInvalidRadioButton.setSelection(true);
-			break;
-	}
-	this.statusSmallBuildValueCheckBox.setSelection(false);
-	this.statusSmallDeltaValueCheckBox.setSelection(false);
-	switch (writeStatus & STATUS_SMALL_VALUE_MASK) {
-		case STATUS_SMALL_VALUE_BUILD:
-			this.statusSmallBuildValueCheckBox.setSelection(true);
-			break;
-		case STATUS_SMALL_VALUE_DELTA:
-			this.statusSmallDeltaValueCheckBox.setSelection(true);
-			break;
-	}
-	this.statusStatisticNoneRadioButton.setSelection(false);
-	this.statusStatisticErraticRadioButton.setSelection(false);
-	this.statusStatisticUnstableRadioButton.setSelection(false);
-	switch (writeStatus & STATUS_STATISTICS_MASK) {
-		case 0:
-			this.statusStatisticNoneRadioButton.setSelection(true);
-			break;
-		case STATUS_STATISTICS_ERRATIC:
-			this.statusStatisticErraticRadioButton.setSelection(true);
-			break;
-		case STATUS_STATISTICS_UNSTABLE:
-			this.statusStatisticUnstableRadioButton.setSelection(true);
-			break;
-	}
-	this.statusBuildsToConfirm.setText(String.valueOf(writeStatus & STATUS_BUILDS_NUMBER_MASK));
-}
-
-@Override
-public void modifyText(ModifyEvent event) {
-
-	// Add default dimension to results if necessary
-	if (event.getSource() == this.defaultDimensionCombo) {
-		String[] resultsDimensions = this.resultsDimensionsList.getSelection();
-		int length = resultsDimensions.length;
-		String defaultDimension = this.defaultDimensionCombo.getText();
-		for (int i = 0; i < length; i++) {
-			if (resultsDimensions[i].equals(defaultDimension)) {
-				// Default dim is already set as a results dimension, hence nothing has to be done
-				return;
-			}
-		}
-		System.arraycopy(resultsDimensions, 0, resultsDimensions = new String[length + 1], 0, length);
-		resultsDimensions[length] = defaultDimension;
-		this.resultsDimensionsList.setSelection(resultsDimensions);
-	}
-
-	// Verify the 'builds to confirm' number
-	if (event.getSource() == this.statusBuildsToConfirm) {
-		try {
-			int number = Integer.parseInt(this.statusBuildsToConfirm.getText());
-			if (number < 0) {
-				this.statusBuildsToConfirm.setText("0");
-			} else {
-				int buildsNumber = DB_Results.getBuildsNumber();
-				if (number > buildsNumber) {
-					this.statusBuildsToConfirm.setText(String.valueOf(buildsNumber));
-				}
-			}
-		}
-		catch (NumberFormatException nfe) {
-			this.statusBuildsToConfirm.setText("1");
-		}
-	}
-}
-
-
-/**
- * @param milestone
- */
-void openMilestoneErrorMessage(String milestone) {
-	MessageDialog.openError(getShell(), getDialogTitle(), milestone+" is an invalid milestone date. Only 'yyyymmddHHMM' format is accepted!");
-}
-
-@Override
-protected void performDefaults() {
-	super.performDefaults();
-	initializeDefaults();
-}
-
-@Override
-public boolean performOk() {
-	final boolean hasBuildsView = this.buildsView != null;
-	if (hasBuildsView) {
-		storeValues();
-		try {
-			IEclipsePreferences preferences = InstanceScope.INSTANCE.getNode(PLUGIN_ID);
-			preferences.flush();
-			this.buildsView.resetView();
-		} catch (BackingStoreException e) {
-			e.printStackTrace();
-			return false;
-		}
-	}
-	return true;
-}
-
-/**
- * Stores the values of the controls back to the preference store.
- */
-private void storeValues() {
-	IPreferenceStore store = getPreferenceStore();
-
-	// Set version
-	int version;
-	if (this.mVersionRadioButton.getSelection()) {
-		version = ECLIPSE_MAINTENANCE_VERSION;
-	} else {
-		version = ECLIPSE_DEVELOPMENT_VERSION;
-	}
-	store.setValue(PRE_ECLIPSE_VERSION, version);
-
-	// Set database values
-	store.setValue(PRE_DATABASE_CONNECTION, this.dbConnectionCheckBox.getSelection());
-	final boolean dbLocal = this.dbLocalRadioButton.getSelection();
-	store.setValue(PRE_DATABASE_LOCAL, dbLocal);
-	String location = this.databaseLocationCombo.getText();
-	if (dbLocal) {
-		store.setValue(PRE_DATABASE_LOCATION, location);
-	} else {
-		store.setValue(PRE_DATABASE_LOCATION, NETWORK_DATABASE_LOCATION);
-	}
-	int count = this.databaseLocationCombo.getItemCount();
-	for (int i=0; i<count; i++) {
-		String item = this.databaseLocationCombo.getItem(i);
-		if (item.equals(location)) {
-			this.databaseLocationCombo.remove(i);
-			break;
-		}
-	}
-	if (dbLocal) {
-		this.databaseLocationCombo.add(location, 0);
-	}
-	int i=0;
-	for (; i<count; i++) {
-		String item = this.databaseLocationCombo.getItem(i);
-		if (item.length() == 0) break;
-		store.setValue(PRE_DATABASE_LOCATION+"."+i, item);
-	}
-	while (store.getString(PRE_DATABASE_LOCATION+"."+i).length() > 0) {
-		store.setToDefault(PRE_DATABASE_LOCATION+"."+i);
-		i++;
-	}
-
-	// Set status values
-	int writeStatus = 0;
-	if (this.statusValuesCheckBox.getSelection()) {
-		writeStatus |= STATUS_VALUES;
-	}
-	if (this.statusErrorNoneRadioButton.getSelection()) {
-		writeStatus |= STATUS_ERROR_NONE;
-	} else if (this.statusErrorNoticeableRadioButton.getSelection()) {
-		writeStatus |= STATUS_ERROR_NOTICEABLE;
-	} else if (this.statusErrorSuspiciousRadioButton.getSelection()) {
-		writeStatus |= STATUS_ERROR_SUSPICIOUS;
-	} else if (this.statusErrorWeirdRadioButton.getSelection()) {
-		writeStatus |= STATUS_ERROR_WEIRD;
-	} else if (this.statusErrorInvalidRadioButton.getSelection()) {
-		writeStatus |= STATUS_ERROR_INVALID;
-	}
-	if (this.statusSmallBuildValueCheckBox.getSelection()) {
-		writeStatus |= STATUS_SMALL_VALUE_BUILD;
-	}
-	if (this.statusSmallDeltaValueCheckBox.getSelection()) {
-		writeStatus |= STATUS_SMALL_VALUE_DELTA;
-	}
-	if (this.statusStatisticNoneRadioButton.getSelection()) {
-		writeStatus &= ~STATUS_STATISTICS_MASK;
-	} else if (this.statusStatisticErraticRadioButton.getSelection()) {
-		writeStatus |= STATUS_STATISTICS_ERRATIC;
-	} else if (this.statusStatisticUnstableRadioButton.getSelection()) {
-		writeStatus |= STATUS_STATISTICS_UNSTABLE;
-	}
-	writeStatus += Integer.parseInt(this.statusBuildsToConfirm.getText());
-	store.setValue(PRE_WRITE_STATUS, writeStatus);
-
-	// Init comparison thresholds
-	store.setValue(PRE_COMPARISON_THRESHOLD_FAILURE, Integer.parseInt(this.comparisonThresholdFailure.getText()));
-	store.setValue(PRE_COMPARISON_THRESHOLD_ERROR, Integer.parseInt(this.comparisonThresholdError.getText()));
-	store.setValue(PRE_COMPARISON_THRESHOLD_IMPROVEMENT, Integer.parseInt(this.comparisonThresholdImprovement.getText()));
-
-	// Set milestones
-	String prefix = PRE_MILESTONE_BUILDS + "." + version;
-
-	// Unset previous additional milestones
-	String milestone = store.getString(prefix + count);
-	while (milestone != null && milestone.length() > 0) {
-		store.putValue(prefix + count++, "");
-		milestone = store.getString(prefix + count);
-	}
-
-	// Set default dimension
-	String defaultDimension = this.defaultDimensionCombo.getText();
-	store.putValue(PRE_DEFAULT_DIMENSION, defaultDimension);
-	DB_Results.setDefaultDimension(defaultDimension);
-
-	// Set generated dimensions
-	int[] indices = this.resultsDimensionsList.getSelectionIndices();
-	int length = indices.length;
-	String[] dimensions = new String[length];
-	if (length > 0) {
-		for (i = 0; i < indices.length; i++) {
-			dimensions[i] = this.resultsDimensionsList.getItem(indices[i]);
-			store.putValue(PRE_RESULTS_DIMENSION + "." + i, dimensions[i]);
-		}
-	}
-	int currentLength = DB_Results.getResultsDimensions().length;
-	if (currentLength > length) {
-		for (i = currentLength - 1; i >= length; i--) {
-			store.putValue(PRE_RESULTS_DIMENSION + "." + i, ""); // reset extra dimensions
-		}
-	}
-	DB_Results.setResultsDimensions(dimensions);
-
-}
-
-@Override
-public void widgetDefaultSelected(SelectionEvent event) {
-}
-
-@Override
-public void widgetSelected(SelectionEvent event) {
-
-	// As for directory when 'Local' button is pushed
-	final Object source = event.getSource();
-	if (source == this.dbLocalBrowseButton) {
-		String location = this.databaseLocationCombo.getText();
-		String path = getDirectoryPath(location);
-		if (path != null) {
-			// First verify that the selected dir was correct
-			int version;
-			if (this.mVersionRadioButton.getSelection()) {
-				version = ECLIPSE_MAINTENANCE_VERSION;
-			} else {
-				version = ECLIPSE_DEVELOPMENT_VERSION;
-			}
-			File dbDir = new File(path, "perfDb"+version);
-			if (!dbDir.exists() || !dbDir.isDirectory()) {
-				StringBuilder message = new StringBuilder("Invalid performance database directory\n");
-				message.append(path+" should contain 'perfDb");
-				message.append(version);
-				message.append("' directory and none was found!");
-				MessageDialog.openError(getShell(), getDialogTitle(), message.toString());
-				return;
-			}
-
-			// Look for selected dir in combo box list
-			int count = this.databaseLocationCombo.getItemCount();
-			int index = -1;
-			for (int i = 0; i < count; i++) {
-				String item = this.databaseLocationCombo.getItem(i);
-				if (item.length() == 0) { // nothing in the combo-box list
-					break;
-				}
-				if (item.equals(path)) {
-					index = i;
-					break;
-				}
-			}
-			// Set the selected dir the more recent in the previous dirs list
-			if (index !=  0) {
-				if (index > 0) {
-					// the dir was used before, but not recently => remove it from previous dirs list
-					this.databaseLocationCombo.remove(index);
-				}
-				// add the selected dir on the top of the previous dirs list
-				this.databaseLocationCombo.add(path, 0);
-			}
-			// Set combo box text
-			this.databaseLocationCombo.setText(path);
-			updateLocalDb();
-		}
-	}
-
-	// Reset dabase location when 'Releng' button is pushed
-	if (source == this.dbConnectionCheckBox) {
-		updateDatabaseGroup();
-	}
-
-	// Reset dabase location when 'Releng' check-box is checked
-	if (source == this.dbLocalRadioButton) {
-		updateLocalDb();
-	}
-
-	// Add default dimension to results if necessary
-	if (source == this.resultsDimensionsList) {
-		String[] resultsDimensions = this.resultsDimensionsList.getSelection();
-		int length = resultsDimensions.length;
-		String defaultDimension = this.defaultDimensionCombo.getText();
-		for (int i = 0; i < length; i++) {
-			if (resultsDimensions[i].equals(defaultDimension)) {
-				// Default dim is already set as a results dimension, hence nothing has to be done
-				return;
-			}
-		}
-		System.arraycopy(resultsDimensions, 0, resultsDimensions = new String[length + 1], 0, length);
-		resultsDimensions[length] = defaultDimension;
-		this.resultsDimensionsList.setSelection(resultsDimensions);
-	}
-
-//	if (source == this.lastBuildCheckBox) {
-//		this.lastBuildCombo.setEnabled(this.lastBuildCheckBox.getSelection());
-//	}
-
-	if (source == this.mVersionRadioButton) {
-		if (this.mVersionRadioButton.getSelection()) {
-		    updateBrowseButtonToolTip(ECLIPSE_MAINTENANCE_VERSION);
-		}
-	}
-
-	if (source == this.dVersionRadionButton) {
-		if (this.dVersionRadionButton.getSelection()) {
-		    updateBrowseButtonToolTip(ECLIPSE_DEVELOPMENT_VERSION);
-		}
-	}
-}
-
-/*
- * Update browse tooltip
- */
-void updateBrowseButtonToolTip(int version) {
-	this.dbLocalBrowseButton.setToolTipText("Select the directory where the database was unzipped\n(i.e. should contain the perfDb"+version+" subdirectory)");
-}
-
-/*
- * Update database group controls.
- */
-void updateDatabaseGroup() {
-	if (this.dbConnectionCheckBox.getSelection()) {
-		this.dbRelengRadioButton.setEnabled(true);
-		this.dbLocalRadioButton.setEnabled(true);
-		updateLocalDb();
-	} else {
-		this.dbRelengRadioButton.setEnabled(false);
-		this.dbLocalRadioButton.setEnabled(false);
-		this.databaseLocationCombo.setEnabled(false);
-		this.dbLocalBrowseButton.setEnabled(false);
-		setValid(true);
-	}
-}
-
-/*
- * Update database location controls.
- */
-void updateLocalDb() {
-	if (this.dbLocalRadioButton.getSelection()) {
-		this.databaseLocationCombo.setEnabled(true);
-		this.dbLocalBrowseButton.setEnabled(true);
-		if (this.databaseLocationCombo.getItemCount() == 0) {
-			this.databaseLocationCombo.setText("");
-			setValid(false);
-		} else {
-			this.databaseLocationCombo.select(0);
-			setValid(true);
-		}
-		this.dbRelengRadioButton.setToolTipText("");
-		this.dbLocationLabel.setEnabled(true);
-	} else {
-		this.dbRelengRadioButton.setToolTipText(NETWORK_DATABASE_LOCATION);
-		this.databaseLocationCombo.setText("");
-		this.databaseLocationCombo.setEnabled(false);
-		this.dbLocalBrowseButton.setEnabled(false);
-		setValid(true);
-		this.dbLocationLabel.setEnabled(false);
-	}
-}
-
-}
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformancesView.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformancesView.java
deleted file mode 100644
index 74783b2..0000000
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformancesView.java
+++ /dev/null
@@ -1,580 +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.ui;
-
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.text.NumberFormat;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.test.internal.performance.results.db.DB_Results;
-import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
-import org.eclipse.test.internal.performance.results.model.PerformanceResultsElement;
-import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-import org.osgi.service.prefs.BackingStoreException;
-
-
-/**
- * Abstract view for performance results.
- */
-public abstract class PerformancesView extends ViewPart implements ISelectionChangedListener, IPreferenceChangeListener {
-
-	// Format
-	static final NumberFormat DOUBLE_FORMAT = NumberFormat.getNumberInstance(Locale.US);
-	static {
-		DOUBLE_FORMAT.setMaximumFractionDigits(3);
-	}
-
-	// Graphic constants
-	static final Display DEFAULT_DISPLAY = Display.getDefault();
-	static final Color BLACK= DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_BLACK);
-	static final Color BLUE= DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_BLUE);
-	static final Color GREEN= DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_GREEN);
-	static final Color RED = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_RED);
-	static final Color GRAY = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_GRAY);
-	static final Color DARK_GRAY = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_DARK_GRAY);
-	static final Color YELLOW = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_YELLOW);
-	static final Color WHITE = DEFAULT_DISPLAY.getSystemColor(SWT.COLOR_WHITE);
-
-	// Viewer filters
-	static final ViewerFilter[] NO_FILTER = new ViewerFilter[0];
-	final static ViewerFilter FILTER_BASELINE_BUILDS = new ViewerFilter() {
-		@Override
-    public boolean select(Viewer v, Object parentElement, Object element) {
-			if (element instanceof BuildResultsElement) {
-				BuildResultsElement buildElement = (BuildResultsElement) element;
-				return !buildElement.getName().startsWith(DB_Results.getDbBaselinePrefix());
-			}
-			return true;
-		}
-	};
-	final static ViewerFilter FILTER_OLD_BUILDS = new ViewerFilter() {
-		@Override
-    public boolean select(Viewer v, Object parentElement, Object element) {
-			if (element instanceof BuildResultsElement) {
-				BuildResultsElement buildElement = (BuildResultsElement) element;
-				return buildElement.isImportant();
-			}
-	        return true;
-        }
-	};
-	Set<ViewerFilter> viewFilters = new HashSet<>();
-
-	// SWT resources
-	Shell shell;
-	Display display;
-	TreeViewer viewer;
-	IPropertySheetPage propertyPage;
-
-	// Directories
-	File dataDir;
-	File resultsDir = null;
-
-	// Views
-	IMemento viewState;
-
-	// Results model information
-	PerformanceResultsElement results;
-
-	// Actions
-	Action changeDataDir;
-	Action filterBaselineBuilds;
-	Action filterOldBuilds;
-//	Action dbConnection;
-
-	// Eclipse preferences
-	IEclipsePreferences preferences;
-
-/**
- * Get a view from its ID.
- *
- * @param viewId The ID of the view
- * @return The found view or <code>null</code> if not found.
- */
-static IViewPart getWorkbenchView(String viewId) {
-	IWorkbench workbench = PlatformUI.getWorkbench();
-	IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-	int length = windows.length;
-	for (int i=0; i<length; i++) {
-		IWorkbenchWindow window = windows[i];
-		IWorkbenchPage[] pages = window.getPages();
-		int pLength = pages.length;
-		for (int j=0; j<pLength; j++) {
-			IWorkbenchPage page = pages[i];
-			IViewPart view = page.findView(viewId);
-			if (view != null) {
-				return view;
-			}
-		}
-	}
-	return null;
-}
-
-/**
- * The constructor.
- */
-public PerformancesView() {
-
-	// Get preferences
-	this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
-
-	// Init db constants
-	int eclipseVersion = this.preferences.getInt(IPerformancesConstants.PRE_ECLIPSE_VERSION, IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
-	String databaseLocation = this.preferences.get(IPerformancesConstants.PRE_DATABASE_LOCATION, IPerformancesConstants.NETWORK_DATABASE_LOCATION);
-	boolean connected = this.preferences.getBoolean(IPerformancesConstants.PRE_DATABASE_CONNECTION, IPerformancesConstants.DEFAULT_DATABASE_CONNECTION);
-	DB_Results.updateDbConstants(connected, eclipseVersion, databaseLocation);
-	this.preferences.addPreferenceChangeListener(this);
-
-	// Init tool tip
-	setTitleToolTip();
-
-}
-
-File changeDataDir(String lastBuild) {
-	String localDataDir = this.preferences.get(IPerformancesConstants.PRE_LOCAL_DATA_DIR, "");
-	String filter = (this.dataDir == null) ? localDataDir : this.dataDir.getPath();
-	File dir = this.dataDir;
-	this.dataDir = changeDir(filter, "Select directory for data local files");
-	boolean refresh = false;
-	if (this.dataDir != null) {
-		this.preferences.put(IPerformancesConstants.PRE_LOCAL_DATA_DIR, this.dataDir.getAbsolutePath());
-		if (dir != null && dir.getPath().equals(this.dataDir.getPath())) {
-			refresh = MessageDialog.openQuestion(this.shell, getTitleToolTip(), "Do you want to read local file again?");
-		} else {
-			refresh = true;
-		}
-		if (refresh) {
-			// Confirm the read when there's a last build set
-			if (lastBuild != null) {
-				if (!MessageDialog.openConfirm(PerformancesView.this.shell, getTitleToolTip(), "Only builds before "+lastBuild+" will be taken into account!\nDo you want to continue?")) {
-					return null;
-				}
-			}
-			refresh(lastBuild);
-			return getSiblingView().dataDir = this.dataDir;
-		}
-	}
-	return null;
-}
-
-/*
- * Select a directory.
- */
-File changeDir(String filter, String msg) {
-    DirectoryDialog dialog = new DirectoryDialog(getSite().getShell(), SWT.OPEN);
-    dialog.setText(getTitleToolTip());
-    dialog.setMessage(msg);
-    if (filter != null) {
-    	dialog.setFilterPath(filter);
-    }
-    String path = dialog.open();
-    if (path != null) {
-	    File dir = new File(path);
-	    if (dir.exists() && dir.isDirectory()) {
-    		return dir;
-	    }
-    }
-    return null;
-}
-
-/*
- * Contribute actions to bars.
- */
-void contributeToActionBars() {
-	IActionBars bars = getViewSite().getActionBars();
-	fillLocalPullDown(bars.getMenuManager());
-	fillLocalToolBar(bars.getToolBarManager());
-}
-
-@Override
-public void createPartControl(Composite parent) {
-	// Cache the shell and display.
-	this.shell = parent.getShell ();
-	this.display = this.shell.getDisplay ();
-}
-
-/*
- * Fill the context menu.
- */
-void fillContextMenu(@SuppressWarnings("unused") IMenuManager manager) {
-	// no default contextual action
-}
-
-/*
- * Fill the filters drop-down menu.
- */
-void fillFiltersDropDown(IMenuManager manager) {
-	manager.add(this.filterBaselineBuilds);
-}
-
-/*
- * Fill the local data drop-down menu
- */
-void fillLocalDataDropDown(IMenuManager manager) {
-	manager.add(this.changeDataDir);
-}
-
-/*
- * Fill the local pull down menu.
- */
-void fillLocalPullDown(IMenuManager manager) {
-
-	// Filters menu
-	MenuManager filtersManager= new MenuManager("Filters");
-	fillFiltersDropDown(filtersManager);
-	manager.add(filtersManager);
-
-	// Local data menu
-	MenuManager localDataManager= new MenuManager("Local data");
-	fillLocalDataDropDown(localDataManager);
-	manager.add(localDataManager);
-}
-
-/*
- * Fill the local toolbar.
- */
-void fillLocalToolBar(@SuppressWarnings("unused") IToolBarManager manager) {
-	// no default toolbar action
-}
-
-/*
- * Filter non milestone builds action run.
- */
-void filterOldBuilds(boolean filter) {
-	if (filter) {
-		this.viewFilters.add(FILTER_OLD_BUILDS);
-	} else {
-		this.viewFilters.remove(FILTER_OLD_BUILDS);
-	}
-	this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, filter);
-	updateFilters();
-}
-
-/*
- * Finalize the viewer creation
- */
-void finalizeViewerCreation() {
-	makeActions();
-	hookContextMenu();
-	contributeToActionBars();
-	restoreState();
-	updateFilters();
-	this.viewer.setInput(getViewSite());
-	this.viewer.addSelectionChangedListener(this);
-}
-
-@Override
-public <T> T getAdapter(Class<T> adapter) {
-    if (adapter.equals(IPropertySheetPage.class)) {
-        return adapter.cast(getPropertySheet());
-    }
-    return super.getAdapter(adapter);
-}
-
-/**
- * Returns the property sheet.
- */
-protected IPropertySheetPage getPropertySheet() {
-	if (this.propertyPage == null) {
-		this.propertyPage = new PropertySheetPage();
-	}
-    return this.propertyPage;
-}
-
-/*
- * Get the sibling view (see subclasses).
- */
-abstract PerformancesView getSiblingView();
-
-/*
- * Hook the context menu.
- */
-void hookContextMenu() {
-	MenuManager menuMgr = new MenuManager("#PopupMenu");
-	menuMgr.setRemoveAllWhenShown(true);
-	menuMgr.addMenuListener(this::fillContextMenu);
-	Menu menu = menuMgr.createContextMenu(this.viewer.getControl());
-	this.viewer.getControl().setMenu(menu);
-	getSite().registerContextMenu(menuMgr, this.viewer);
-}
-
-@Override
-public void init(IViewSite site, IMemento memento) throws PartInitException {
-	super.init(site, memento);
-	this.viewState = memento;
-}
-
-/*
- * Init results
- */
-void initResults() {
-	this.results = PerformanceResultsElement.PERF_RESULTS_MODEL;
-	if (this.results.isInitialized()) {
-		this.dataDir = getSiblingView().dataDir;
-	} else {
-		String localDataDir = this.preferences.get(IPerformancesConstants.PRE_LOCAL_DATA_DIR, null);
-		if (localDataDir != null) {
-			File dir = new File(localDataDir);
-			if (dir.exists() && dir.isDirectory()) {
-				this.dataDir = dir;
-				readLocalFiles(null);
-			}
-		}
-	}
-}
-
-/*
- * Make common actions to performance views.
- */
-void makeActions() {
-
-	// Change data dir action
-	this.changeDataDir = new Action("&Read...") {
-		@Override
-    public void run() {
-			changeDataDir(null);
-		}
-	};
-	this.changeDataDir.setToolTipText("Change the directory of the local data files");
-//	this.changeDataDir.setImageDescriptor(ResultsElement.FOLDER_IMAGE_DESCRIPTOR);
-
-	// Filter baselines action
-	this.filterBaselineBuilds = new Action("&Baselines", IAction.AS_CHECK_BOX) {
-		@Override
-    public void run() {
-			if (isChecked()) {
-				PerformancesView.this.viewFilters.add(FILTER_BASELINE_BUILDS);
-			} else {
-				PerformancesView.this.viewFilters.remove(FILTER_BASELINE_BUILDS);
-			}
-			updateFilters();
-        }
-	};
-	this.filterBaselineBuilds.setToolTipText("Filter baseline builds");
-
-	// Filter non-important builds action
-	this.filterOldBuilds = new Action("&Old Builds", IAction.AS_CHECK_BOX) {
-		@Override
-    public void run() {
-			filterOldBuilds(isChecked());
-		}
-	};
-	this.filterOldBuilds.setChecked(false);
-	this.filterOldBuilds.setToolTipText("Filter old builds (i.e. before last milestone) but keep all previous milestones)");
-}
-
-@Override
-public void preferenceChange(PreferenceChangeEvent event) {
-	// do nothing
-}
-
-/*
- * Read local files
- */
-void readLocalFiles(final String lastBuild) {
-
-	// Create runnable to read local files
-	IRunnableWithProgress runnable = monitor -> {
-  	try {
-  		monitor.beginTask("Read local files", 1000);
-  		PerformancesView.this.results.readLocal(PerformancesView.this.dataDir, monitor, lastBuild);
-  		monitor.done();
-  	} catch (Exception e) {
-  		e.printStackTrace();
-  	}
-  };
-
-	// Execute the runnable with progress
-	ProgressMonitorDialog readProgress = new ProgressMonitorDialog(getSite().getShell());
-	try {
-		readProgress.run(true, true, runnable);
-	} catch (InvocationTargetException e) {
-		// skip
-	} catch (InterruptedException e) {
-		// skip
-	}
-}
-
-/*
- * Refresh the views.
- */
-void refresh(String lastBuild) {
-
-	// Read local files
-	readLocalFiles(lastBuild);
-
-	// Refresh views
-	refreshInput();
-	getSiblingView().refreshInput();
-}
-
-/*
- * Refresh the entire view by resetting its input.
- */
-void refreshInput() {
-	this.viewer.setInput(getViewSite());
-	this.viewer.refresh();
-}
-
-/*
- * Clear view content.
- */
-void resetInput() {
-	this.results.reset(null);
-	this.viewer.setInput(getViewSite());
-	this.viewer.refresh();
-}
-
-/*
- * Restore the view state from the memento information.
- */
-void restoreState() {
-
-	// Filter baselines action state
-	if (this.viewState != null) {
-		Boolean filterBaselinesState = this.viewState.getBoolean(IPerformancesConstants.PRE_FILTER_BASELINE_BUILDS);
-		boolean filterBaselinesValue = filterBaselinesState == null ? false : filterBaselinesState.booleanValue();
-		this.filterBaselineBuilds.setChecked(filterBaselinesValue);
-		if (filterBaselinesValue) {
-			this.viewFilters.add(FILTER_BASELINE_BUILDS);
-		}
-		String dir = this.viewState.getString(IPerformancesConstants.PRE_WRITE_RESULTS_DIR);
-		if (dir != null) {
-			this.resultsDir = new File(dir);
-		}
-	}
-
-	// Filter non important builds action state
-	boolean checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS);
-	this.filterOldBuilds.setChecked(checked);
-	if (checked) {
-		this.viewFilters.add(FILTER_OLD_BUILDS);
-	}
-}
-
-@Override
-public void saveState(IMemento memento) {
-	super.saveState(memento);
-	memento.putBoolean(IPerformancesConstants.PRE_FILTER_BASELINE_BUILDS, this.filterBaselineBuilds.isChecked());
-	try {
-		this.preferences.flush();
-	} catch (BackingStoreException e) {
-		// ignore
-	}
-	if (this.resultsDir != null) {
-		memento.putString(IPerformancesConstants.PRE_WRITE_RESULTS_DIR, this.resultsDir.getPath());
-	}
-}
-
-@Override
-public void selectionChanged(SelectionChangedEvent event) {
-	if (this.propertyPage != null) {
-		this.propertyPage.selectionChanged(this, event.getSelection());
-	}
-}
-
-/**
- * Passing the focus request to the viewer's control.
- */
-@Override
-public void setFocus() {
-	this.viewer.getControl().setFocus();
-}
-
-/*
- * Set the view tooltip to reflect the DB connection kind.
- */
-void setTitleToolTip() {
-	String title = DB_Results.getDbTitle();
-	if (title == null) {
-		// DB is not connected
-		int version = this.preferences.getInt(IPerformancesConstants.PRE_ECLIPSE_VERSION, IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
-		title = "Eclipse v" + version + " - DB not connected";
-	}
-	setTitleToolTip(title);
-}
-
-/*
- * Set/unset the database connection.
- *
-void toogleDbConnection() {
-
-	// Toogle DB connection and store new state
-	boolean dbConnected = this.preferences.getBoolean(IPerformancesConstants.PRE_DATABASE_CONNECTION, IPerformancesConstants.DEFAULT_DATABASE_CONNECTION);
-	DB_Results.DB_CONNECTION = !dbConnected;
-	getSiblingView().dbConnection.setChecked(DB_Results.DB_CONNECTION);
-	this.preferences.putBoolean(IPerformancesConstants.PRE_DATABASE_CONNECTION, DB_Results.DB_CONNECTION);
-
-	// First close DB connection
-	if (!DB_Results.DB_CONNECTION) {
-		DB_Results.shutdown();
-	}
-
-	// Read local files if any
-	if (this.dataDir != null) {
-		readLocalFiles();
-	}
-
-	// Refresh views
-	refreshInput();
-	getSiblingView().refreshInput();
-}
-*/
-
-/*
- * Update the filters from the stored list and apply them to the view.
- */
-final void updateFilters() {
-	ViewerFilter[] filters = new ViewerFilter[this.viewFilters.size()];
-	this.viewFilters.toArray(filters);
-	this.viewer.setFilters(filters);
-}
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.test.performance.ui/toc.xml b/bundles/org.eclipse.test.performance.ui/toc.xml
deleted file mode 100644
index e6becb2..0000000
--- a/bundles/org.eclipse.test.performance.ui/toc.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?NLS TYPE="org.eclipse.help.toc"?>
-
-<toc label="Performance Results Guide">
-    <topic label="Overview"  href="html/overview.html"> 
-        <topic label="Preferences" href="html/preferences.html"/> 
-        <topic label="Local data" href="html/local_data.html"/> 
-    </topic>
-    <topic label="Views">
-        <topic label="Components" href="html/components.html"/> 
-        <topic label="Properties" href="html/properties.html"/> 
-        <topic label="Builds" href="html/builds.html"/> 
-        <topic label="Results" href="html/results.html"/>
-        <topic href="html/builds-comparison.html" label="Builds Comparison"/>
-    </topic>
-    <topic label="Verification" href="html/verification.html"/> 
-</toc>
