HEAD - 288234: v2
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 a68b73d..0d00e40 100644
--- a/bundles/org.eclipse.test.performance.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.test.performance.ui/META-INF/MANIFEST.MF
@@ -14,11 +14,11 @@
  Cloudscape;resolution:=optional,
  org.eclipse.test.performance.derby;bundle-version="10.4.2";resolution:=optional,
  org.junit,
- org.eclipse.ui.views;bundle-version="3.4.0",
+ org.eclipse.ui.views;bundle-version="3.4.0";resolution:=optional,
  org.eclipse.test.performance;bundle-version="3.6.0",
- org.eclipse.ui;bundle-version="3.5.0",
- org.eclipse.ui.ide;bundle-version="3.5.0",
- org.eclipse.core.resources;bundle-version="3.5.100"
+ 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"
 Bundle-RequiredExecutionEnvironment: J2SE-1.4
 Export-Package: org.eclipse.test.internal.performance.results.db,
  org.eclipse.test.internal.performance.results.model,
diff --git a/bundles/org.eclipse.test.performance.ui/build.properties b/bundles/org.eclipse.test.performance.ui/build.properties
index 6277598..07c50a4 100644
--- a/bundles/org.eclipse.test.performance.ui/build.properties
+++ b/bundles/org.eclipse.test.performance.ui/build.properties
@@ -11,12 +11,16 @@
 
 bin.includes = about.html,\
                META-INF/,\
-               performanceui.jar,\
                images/,\
                plugin.xml,\
                readme.html,\
                scripts/,\
-               icons/
+               icons/,\
+               html/,\
+               performanceui.jar,\
+               toc.xml,\
+               contexts.xml,\
+               doc/
 source.performanceui.jar = src/
 jars.compile.order = performanceui.jar
 src.includes = src/
diff --git a/bundles/org.eclipse.test.performance.ui/contexts.xml b/bundles/org.eclipse.test.performance.ui/contexts.xml
new file mode 100644
index 0000000..c205f96
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/contexts.xml
@@ -0,0 +1,30 @@
+<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/doc/help.html b/bundles/org.eclipse.test.performance.ui/doc/help.html
index 2ab7a99..74a75e6 100644
--- a/bundles/org.eclipse.test.performance.ui/doc/help.html
+++ b/bundles/org.eclipse.test.performance.ui/doc/help.html
@@ -52,7 +52,7 @@
 <p>Tips are almost the same for linear and logarithmic scales:</p>
 <table border="0">
   <tr>
-    <td valign="top"><img src="images/light.gif"></td>
+    <td valign="top"><img src="../images/light.gif"></td>
     <td><b>Flying over a bar displays its time value<b>:</td></tr>
   </tr>
   <tr>
@@ -65,7 +65,7 @@
   </tr>
   <tr><td><br></td></tr>
   <tr>
-    <td valign="top"><img src="images/light.gif"></td>
+    <td valign="top"><img src="../images/light.gif"></td>
     <td><b>For <u>linear scale only</u>, when the error on the time result is noticeable,
 		then the measurement uncertainty is shown in yellow at the end of the bar<b>:</td></tr>
   </tr>
@@ -75,7 +75,7 @@
   </tr>
   <tr><td><br></td></tr>
   <tr>
-    <td valign="top"><img src="images/light.gif"></td>
+    <td valign="top"><img src="../images/light.gif"></td>
     <td><b>A performance regression may sometimes have a known good reason</b>.<br>
     In this case, the current build bar is grayed and flying over it also shows the given explanation:</td></tr>
   </tr>
@@ -85,7 +85,7 @@
   </tr>
   <tr><td><br></td></tr>
   <tr>
-    <td valign="top"><img src="images/light.gif"></td>
+    <td valign="top"><img src="../images/light.gif"></td>
     <td><b>Test result may have big error which can make the test result not fully reliable</b>.<br>
   In this case, a warning icon is shown after the variation value and flying over it gives the offending error value:</td></tr>
   </tr>
@@ -95,7 +95,7 @@
   </tr>
   <tr><td><br></td></tr>
   <tr>
-    <td valign="top"><img src="images/light.gif"></td>
+    <td valign="top"><img src="../images/light.gif"></td>
     <td><b>Test may have no result for the used baseline, hence the first available build is used as a reference</b>.<br>
   In this case, a warning icon is shown after the scenario title and flying over it gives the build ID used to compute the variation:</td></tr>
   </tr>
diff --git a/bundles/org.eclipse.test.performance.ui/doc/images/light.gif b/bundles/org.eclipse.test.performance.ui/doc/images/light.gif
deleted file mode 100644
index 542dddc..0000000
--- a/bundles/org.eclipse.test.performance.ui/doc/images/light.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/html/builds.html b/bundles/org.eclipse.test.performance.ui/html/builds.html
new file mode 100644
index 0000000..e0dcf60
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/builds.html
@@ -0,0 +1,84 @@
+<!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>
+<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>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>Nightly: hide the nightly builds (starting with 'N')</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
new file mode 100644
index 0000000..be5b75d
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/components.html
@@ -0,0 +1,92 @@
+<!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:
+<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><p>
+The information icon gives some other interesting information:
+<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><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>Nightly: hide the nightly builds (starting with 'N')</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 fingerprints
+scenario, hence the corresponding filter is also activated by default.
+</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
new file mode 100644
index 0000000..42af1f4
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-baseline.png
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
new file mode 100644
index 0000000..5a746ca
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-fingerprints.png
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
new file mode 100644
index 0000000..c2d8a62
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/builds-generate-menu.png
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
new file mode 100644
index 0000000..c49239c
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/builds-missinglocaldata.png
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
new file mode 100644
index 0000000..a745a51
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/builds-nolocaldata.png
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
new file mode 100644
index 0000000..d3935e5
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/builds-update.png
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
new file mode 100644
index 0000000..7740942
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/builds-updateall.png
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
new file mode 100644
index 0000000..5a41cc7
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/components.png
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
new file mode 100644
index 0000000..a010ac4
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/perspective.png
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
new file mode 100644
index 0000000..321ba22
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/preferences.png
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
new file mode 100644
index 0000000..71255cb
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/properties-survey-comment.png
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
new file mode 100644
index 0000000..9954107
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/properties-warnings.png
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
new file mode 100644
index 0000000..7594237
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/verification-comment.png
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
new file mode 100644
index 0000000..2369c2e
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/verification-components.png
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
new file mode 100644
index 0000000..7c739c4
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/images/verification-failures.png
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
new file mode 100644
index 0000000..1d55a69
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/local_data.html
@@ -0,0 +1,41 @@
+<!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><p>
+<i>Notes
+<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>
+</i>
+</p><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><p>
+<i>Notes
+<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>
+</i>
+</p>
+</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
new file mode 100644
index 0000000..45001b0
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/overview.html
@@ -0,0 +1,46 @@
+<!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:
+<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><p>
+The goal of this tool is both to look at performance results database numbers
+and to verify whether a build result may have scenario 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 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.5-200906111540/performance/performance.php">Eclipse 3.5.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
new file mode 100644
index 0000000..61c6858
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/preferences.html
@@ -0,0 +1,57 @@
+<!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>
+Here's what the page looks like:
+<p><img src="images/preferences.png" alt="Preferences"/></p>
+
+<h2>Database</h2>
+<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>trelenggtk</b></code>).
+</p>
+
+<h2>Milestones</h2>
+<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>
+
+<h2>Default dimension</h2>
+<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>Results dimensions</h2>
+<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
new file mode 100644
index 0000000..6470322
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/properties.html
@@ -0,0 +1,46 @@
+<!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
new file mode 100644
index 0000000..fd9e98e
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/results.html
@@ -0,0 +1,57 @@
+<!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>Nightly: hide the nightly builds (starting with 'N')</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>
+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
new file mode 100644
index 0000000..70f2c0b
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/html/verification.html
@@ -0,0 +1,31 @@
+<!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><img src="images/verification-components.png" alt="Verification: failing components"/></p>
+</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/performanceui.jar b/bundles/org.eclipse.test.performance.ui/performanceui.jar
index 2631fc6..d6fcb54 100644
--- a/bundles/org.eclipse.test.performance.ui/performanceui.jar
+++ b/bundles/org.eclipse.test.performance.ui/performanceui.jar
Binary files differ
diff --git a/bundles/org.eclipse.test.performance.ui/plugin.xml b/bundles/org.eclipse.test.performance.ui/plugin.xml
index 885b2b7..491cb79 100644
--- a/bundles/org.eclipse.test.performance.ui/plugin.xml
+++ b/bundles/org.eclipse.test.performance.ui/plugin.xml
@@ -62,10 +62,23 @@
             class="org.eclipse.test.internal.performance.results.ui.PerformanceResultsPerspective"
             icon="icons/perfs.gif"
             id="org.eclipse.test.performance.ui.perspectives.PerformanceResultsPerspective"
-            name="Performances">
+            name="Performances Results">
          <description>
             Perspective to survey the performances of the Eclipse components
          </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/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java
index 7969bbe..f619c8a 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ComponentResults.java
@@ -276,7 +276,7 @@
  * information.
  */
 String readLocalFile(File dir, List scenarios) throws FileNotFoundException {
-	if (!dir.exists()) return null;
+//	if (!dir.exists()) return null;
 	File dataFile = new File(dir, getName()+".dat");	//$NON-NLS-1$
 	if (!dataFile.exists()) throw new FileNotFoundException();
 	DataInputStream stream = null;
@@ -293,17 +293,15 @@
 		for (int i=0; i<size; i++) {
 			// ... which starts with the scenario id
 			int scenario_id = stream.readInt();
-			ScenarioResults scenarioResults = getScenarioResults(scenarios, scenario_id);
+			ScenarioResults scenarioResults = scenarios == null ? null : getScenarioResults(scenarios, scenario_id);
 			if (scenarioResults == null) {
 				// this can happen if scenario pattern does not cover all those stored in local data file
 				// hence, creates a fake scenario to read the numbers and skip to the next scenario
-				/*
 				scenarioResults = new ScenarioResults(-1, null, null);
-				scenarioResults.parent = this;
-				scenarioResults.readData(stream);
-				*/
+//				scenarioResults.parent = this;
+//				scenarioResults.readData(stream);
 				// Should no longer occur as we get all scenarios from database now
-				throw new RuntimeException("Unexpected unfound scenario!"); //$NON-NLS-1$
+//				throw new RuntimeException("Unexpected unfound scenario!"); //$NON-NLS-1$
 			}
 			scenarioResults.parent = this;
 			scenarioResults.printStream = this.printStream;
@@ -409,9 +407,9 @@
  * Write the component results data to the file '<component name>.dat' in the given directory.
  */
 void writeData(String buildName, File dir, boolean temp, boolean dirty) {
-	if (!dir.exists() && !dir.mkdirs()) {
-		System.err.println("can't create directory "+dir); //$NON-NLS-1$
-	}
+//	if (!dir.exists() && !dir.mkdirs()) {
+//		System.err.println("can't create directory "+dir); //$NON-NLS-1$
+//	}
 	File tmpFile = new File(dir, getName()+".tmp"); //$NON-NLS-1$
 	File dataFile = new File(dir, getName()+".dat"); //$NON-NLS-1$
 	if (!dirty) { // only possible on final write
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/DB_Results.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/DB_Results.java
index 39c8d9a..b27dbfc 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/DB_Results.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/DB_Results.java
@@ -30,6 +30,7 @@
 import org.eclipse.test.internal.performance.data.Dim;
 import org.eclipse.test.internal.performance.db.DB;
 import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
+import org.eclipse.test.internal.performance.results.utils.Util;
 import org.eclipse.test.performance.Dimension;
 
 /**
@@ -58,6 +59,7 @@
     private String fDBType;	// either "derby" or "cloudscape"
 
 	    // Preferences info
+    public static boolean DB_CONNECTION = false;
     private static String DB_NAME;
     private static String DB_LOCATION;
 	private static String DB_BASELINE_PREFIX = DEFAULT_DB_BASELINE_PREFIX;
@@ -90,6 +92,7 @@
 	 * @return The location as a string.
 	 */
     public static String getDbLocation() {
+    	if (!DB_CONNECTION) return null;
     	if (DB_LOCATION == null) initDbContants();
     	return DB_LOCATION;
     }
@@ -157,16 +160,22 @@
 
 	/**
 	 * Update the database constants from a new database location.
-	 *
+	 * @param connected Tells whether the database should be connected or not.
 	 * @param databaseLocation The database location.
 	 * 	May be a path to a local folder or a net address
-	 * 	(see {@link IPerformancesConstants#DEFAULT_DATABASE_LOCATION}).
+	 * 	(see {@link IPerformancesConstants#NETWORK_DATABASE_LOCATION}).
 	 */
-	public static void updateDbConstants(int eclipseVersion, String databaseLocation) {
-		DB_LOCATION = databaseLocation == null ? IPerformancesConstants.DEFAULT_DATABASE_LOCATION : databaseLocation;
-		DB_NAME =IPerformancesConstants.DATABASE_NAME_PREFIX + eclipseVersion;
+	public static boolean updateDbConstants(boolean connected, int eclipseVersion, String databaseLocation) {
+		shutdown();
+		DB_CONNECTION = connected;
+		DB_LOCATION = databaseLocation == null ? IPerformancesConstants.NETWORK_DATABASE_LOCATION : databaseLocation;
+		DB_NAME = IPerformancesConstants.DATABASE_NAME_PREFIX + eclipseVersion;
 		DB_VERSION = "v" + eclipseVersion;
-		DB_VERSION_REF = "R-3." + (eclipseVersion - 1);
+		DB_VERSION_REF = "R-3." + (eclipseVersion % 10 - 1);
+		if (connected) {
+			return getDefault().fSQL != null;
+		}
+		return true;
 	}
 
 	/**
@@ -175,6 +184,7 @@
 	 * @return A title as a string.
 	 */
 	public static String getDbTitle() {
+    	if (!DB_CONNECTION) return null;
 		String title = "Eclipse " + DB_VERSION + " - ";
 		if (DB_LOCATION.startsWith("net:")) {
 			title += " Network DB";
@@ -321,32 +331,6 @@
 	private static String[] SCENARII;
 	private static String[] COMMENTS;
 
-	// Static private data
-	private final static int MAX_CONFIGS = 5;
-	/*
-	private final static String[] SUPPORTED_VMS =  { // Consider only supported VMs a static data
-		"sun" //$NON-NLS-1$
-	};
-	private final static String[] SUPPORTED_COMPONENTS = {
-		"org.eclipse.ant", //$NON-NLS-1$
-		"org.eclipse.compare", //$NON-NLS-1$
-		"org.eclipse.core", //$NON-NLS-1$
-		"org.eclipse.help", //$NON-NLS-1$
-		"org.eclipse.jdt.core", //$NON-NLS-1$
-		"org.eclipse.jdt.debug", //$NON-NLS-1$
-		"org.eclipse.jdt.text", //$NON-NLS-1$
-		"org.eclipse.jdt.ui", //$NON-NLS-1$
-		"org.eclipse.jface", //$NON-NLS-1$
-		"org.eclipse.osgi", //$NON-NLS-1$
-		"org.eclipse.pde.api.tools", //$NON-NLS-1$
-		"org.eclipse.pde.ui", //$NON-NLS-1$
-		"org.eclipse.swt", //$NON-NLS-1$
-		"org.eclipse.team", //$NON-NLS-1$
-		"org.eclipse.ua", //$NON-NLS-1$
-		"org.eclipse.ui" //$NON-NLS-1$
-	};
-	*/
-
     //---- private implementation
 
 	/**
@@ -413,7 +397,7 @@
  */
 static int getBuildId(String name) {
 	if (BUILDS == null) return -1;
-	return Arrays.binarySearch(BUILDS, name);
+	return Arrays.binarySearch(BUILDS, name, Util.BUILD_DATE_COMPARATOR);
 }
 
 /**
@@ -509,6 +493,13 @@
 }
 
 /**
+ * Set the default dimension used for performance results.
+ */
+public static void setConfigs(String[] configs) {
+	CONFIGS = configs;
+}
+
+/**
  * Get all configurations read from the database.
  *
  * @return A list of configuration names
@@ -536,6 +527,13 @@
 }
 
 /**
+ * Set the default dimension used for performance results.
+ */
+public static void setConfigDescriptions(String[] descriptions) {
+	CONFIG_DESCRIPTIONS = descriptions;
+}
+
+/**
  * Get all dimensions read from the database.
  *
  * @return A list of dimensions.
@@ -770,7 +768,7 @@
  */
 private void connect() {
 
-	if (this.fConnection != null)
+	if (this.fConnection != null || !DB_CONNECTION)
 		return;
 
 	if (DEBUG) DriverManager.setLogWriter(new PrintWriter(System.out));
@@ -978,7 +976,7 @@
 	}
 	ResultSet result = null;
 	try {
-		CONFIGS = new String[MAX_CONFIGS];
+		CONFIGS = null;
 		BUILDS = null;
 		BUILDS_LENGTH = 0;
 		result = this.fSQL.queryAllVariations(configPattern);
@@ -997,12 +995,6 @@
 		} else {
 			System.arraycopy(BUILDS, 0, BUILDS = new String[BUILDS_LENGTH], 0, BUILDS_LENGTH);
 		}
-		for (int i=0; i<MAX_CONFIGS; i++) {
-			if (CONFIGS[i] == null) {
-				System.arraycopy(CONFIGS, 0, CONFIGS = new String[i], 0, i);
-				break;
-			}
-		}
 	} catch (SQLException e) {
 		PerformanceTestPlugin.log(e);
 	} finally {
@@ -1171,7 +1163,7 @@
 		}
 		return 0;
 	}
-	int idx = Arrays.binarySearch(BUILDS, build);
+	int idx = Arrays.binarySearch(BUILDS, build, Util.BUILD_DATE_COMPARATOR);
 	if (idx >= 0) return idx;
 	int index = -idx-1;
 	int length = BUILDS.length;
@@ -1211,16 +1203,18 @@
  * The list is sorted alphabetically.
  */
 private int storeConfig(String config) {
-	for (int i=0; i<MAX_CONFIGS; i++) {
-		if (CONFIGS[i] == null) {
-			CONFIGS[i] = config;
-			return i;
-		}
-		if (config.equals(CONFIGS[i])) {
-			return i;
-		}
+	if (CONFIGS== null) {
+		CONFIGS= new String[1];
+		CONFIGS[0] = config;
+		return 0;
 	}
-	return -1;
+	int idx = Arrays.binarySearch(CONFIGS, config);
+	if (idx >= 0) return idx;
+	int length = CONFIGS.length;
+	System.arraycopy(CONFIGS, 0, CONFIGS = new String[length+1], 0, length);
+	CONFIGS[length] = config;
+	Arrays.sort(CONFIGS);
+	return length;
 }
 
 /*
@@ -1239,6 +1233,7 @@
 	int length = COMPONENTS.length;
 	System.arraycopy(COMPONENTS, 0, COMPONENTS = new String[length+1], 0, length);
 	COMPONENTS[length] = component;
+	Arrays.sort(COMPONENTS);
 	return length;
 }
 
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/PerformanceResults.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/PerformanceResults.java
index 954816f..63519d6 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/PerformanceResults.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/PerformanceResults.java
@@ -10,8 +10,15 @@
  *******************************************************************************/
 package org.eclipse.test.internal.performance.results.db;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.PrintStream;
 import java.util.*;
 
@@ -43,13 +50,8 @@
 	String[] configDescriptions, sortedConfigDescriptions;
 	private String configPattern;
 
-	final class BuildDateComparator implements Comparator {
-    public int compare(Object o1, Object o2) {
-        String s1 = (String) o1;
-        String s2 = (String) o2;
-        return Util.getBuildDate(s1).compareTo(Util.getBuildDate(s2));
-    }
-    }
+	boolean dbRequired;
+	boolean updateLocalFileNeed;
 
 	/*
 	 * Local class helping to guess remaining time while reading results from DB
@@ -89,11 +91,19 @@
 	public static final int DEFAULT_FAILURE_THRESHOLD = 10;
 	int failure_threshold = DEFAULT_FAILURE_THRESHOLD;
 
+public PerformanceResults(PrintStream stream) {
+	super(null, null);
+	this.printStream = stream;
+	this.dbRequired = false;
+	setDefaults();
+}
+
 public PerformanceResults(String name, String baseline, String baselinePrefix, PrintStream stream) {
 	super(null, name);
 	this.baselineName = baseline;
 	this.baselinePrefix = baselinePrefix;
 	this.printStream = stream;
+	this.dbRequired = true;
 	setDefaults();
 }
 
@@ -305,25 +315,64 @@
 	return componentResults == null ? null : (ScenarioResults) componentResults.getResults(scenarioName);
 }
 
+/*
+ * Init configurations from performance results database.
+ */
+private void initConfigs() {
+	// create config names
+	this.configNames = DB_Results.getConfigs();
+	this.configDescriptions = DB_Results.getConfigDescriptions();
+	int length = this.configNames.length;
+	this.sortedConfigNames = new String[length];
+	for (int i = 0; i < length; i++) {
+	    this.sortedConfigNames[i] = this.configNames[i];
+	}
+
+	// Sort the config names
+	Arrays.sort(this.sortedConfigNames);
+	this.sortedConfigDescriptions = new String[length];
+	for (int i=0; i<length; i++) {
+		for (int j=0; j<length; j++) {
+			if (this.sortedConfigNames[i] == this.configNames[j]) { // == is intentional!
+				this.sortedConfigDescriptions[i] = this.configDescriptions[j];
+				break;
+			}
+		}
+	}
+}
+
+/*
+ * Read or update data for a build from a directory supposed to have local files.
+ */
 private String[] read(boolean local, String buildName, String[][] configs, boolean force, File dataDir, String taskName, SubMonitor subMonitor) {
 	if (local && dataDir == null) {
 		throw new IllegalArgumentException("Must specify a directory to read local files!"); //$NON-NLS-1$
 	}
 	subMonitor.setWorkRemaining(100);
 
-	// Reset
-	boolean reset = local || (buildName == null && force);
-	if (reset) reset();
-
 	// Update info
-	setConfigInfo(configs);
+	if (configs == null) {
+		if (this.configNames == null) {
+			initConfigs();
+		}
+	} else {
+		setConfigInfo(configs);
+	}
 	long start = System.currentTimeMillis();
 	int allScenariosSize;
-    try {
-        allScenariosSize = readScenarios(buildName, subMonitor.newChild(10));
-    } catch (OperationCanceledException e) {
-        return null;
-    }
+	if (DB_Results.DB_CONNECTION) {
+		try {
+			allScenariosSize = readScenarios(buildName, subMonitor.newChild(10)) ;
+			if (allScenariosSize < 0) {
+				return null;
+			}
+		} catch (OperationCanceledException e) {
+			return null;
+		}
+	} else {
+		if (this.allScenarios == null) return null;
+		allScenariosSize = this.allScenarios.size();
+	}
 
 	// Create corresponding children
 	int componentsLength = this.components.length;
@@ -331,7 +380,7 @@
 	RemainingTimeGuess timeGuess = null;
 	for (int i=0; i<componentsLength; i++) {
 		String componentName = this.components[i];
-		List scenarios = (List) this.allScenarios.get(componentName);
+		List scenarios = this.allScenarios == null ? null : (List) this.allScenarios.get(componentName);
 
 		// Manage monitor
 		int percentage = (int) ((((double)(i+1)) / (componentsLength+1)) * 100);
@@ -348,9 +397,9 @@
 		subMonitor.subTask(subTaskBuffer.toString());
 
 		// Get component results
-		if (scenarios == null) continue;
+		if (scenarios == null && !local) continue;
 		ComponentResults componentResults;
-		if (reset) {
+		if (local || (buildName == null && force)) {
 			componentResults = new ComponentResults(this, componentName);
 			addChild(componentResults, true);
 		} else {
@@ -381,6 +430,7 @@
 
 	// Update names
 	setAllBuildNames();
+	writeData(dataDir);
 
 	// Print time
 	printGlobalTime(start);
@@ -391,6 +441,10 @@
 /**
  * Read all data from performance database for the given configurations
  * and scenario pattern.
+ *
+ * This method is typically called when generated performance results
+ * from a non-UI application.
+ *
  * @param buildName The name of the build
  * @param configs All configurations to extract results. If <code>null</code>,
  * 	then all known configurations ({@link DB_Results#getConfigs()})  are read.
@@ -402,7 +456,7 @@
  * 	value compared to the baseline is considered as failing.
  * @param monitor The progress monitor
  *
- * @return All known builds
+ * @return All known build names
  */
 public String[] readAll(String buildName, String[][] configs, String pattern, File dataDir, int threshold, IProgressMonitor monitor) {
 
@@ -415,6 +469,7 @@
 	setDefaults();
 
 	// Read local data files first
+	reset(dataDir);
 	String[] names = read(true, null, configs, true, dataDir, null, subMonitor.newChild(100));
 	if (names==null) {
 		// if one local files is missing then force a full DB read!
@@ -426,7 +481,7 @@
 	boolean buildMissing = true;
 	if (buildName != null) {
 		this.name = buildName;
-		buildMissing = Arrays.binarySearch(names, buildName, new BuildDateComparator()) < 0;
+		buildMissing = Arrays.binarySearch(names, buildName, Util.BUILD_DATE_COMPARATOR) < 0;
 	}
 
 	// Look for missing builds
@@ -434,7 +489,7 @@
 		if (buildName == null) {
 			// Read all missing builds
 			String[] builds = DB_Results.getBuilds();
-			Arrays.sort(builds, new BuildDateComparator());
+			Arrays.sort(builds, Util.BUILD_DATE_COMPARATOR);
 			int lengthDB = builds.length;
 			int lengthLocal = names.length;
 			if (lengthLocal < lengthDB) {
@@ -467,9 +522,8 @@
  *
  * @param dataDir The directory where local files are located
  * @param monitor  The progress monitor
- * @return The list of build names read in local files
  */
-public String[] readLocal(File dataDir, IProgressMonitor monitor) {
+public void readLocal(File dataDir, IProgressMonitor monitor) {
 
 	// Print title
 	String taskName = "Read local performance results"; //$NON-NLS-1$
@@ -480,7 +534,80 @@
 	subMonitor.setTaskName(taskName);
 
 	// Read
-	return read(true, null, null, true, dataDir, taskName, subMonitor);
+	reset(dataDir);
+	read(true, null, null, true, dataDir, taskName, subMonitor);
+}
+
+void readLocalFile(File dir) {
+	if (!dir.exists()) return;
+	File dataFile = new File(dir, "performances.dat");	//$NON-NLS-1$
+	if (!dataFile.exists()) return;
+	DataInputStream stream = null;
+	try {
+		// Read local file info
+		stream = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
+		println(" - read performance results local files info: "); //$NON-NLS-1$
+
+		// Read build info
+		String str = stream.readUTF();
+		this.updateLocalFileNeed = this.name == null || !this.name.equals(str);
+		println("		+ name : "+str);
+		this.name = str == ""  ? null : str;
+		str = stream.readUTF();
+		println("		+ baseline : "+str);
+		this.baselineName = str == "" ? null : str;
+		str = stream.readUTF();
+		println("		+ baseline prefix: "+str);
+		this.baselinePrefix = str == "" ? null : str;
+
+		// Write configs info
+		int length = stream.readInt();
+		println("		+ "+length+" configs");
+		this.configNames = new String[length];
+		this.sortedConfigNames = new String[length];
+		this.configDescriptions = new String[length];
+		this.sortedConfigDescriptions = new String[length];
+		for (int i = 0; i < length; i++) {
+			this.configNames[i] = stream.readUTF();
+			this.sortedConfigNames[i] = this.configNames[i];
+			this.configDescriptions[i] = stream.readUTF();
+			this.sortedConfigDescriptions[i] = this.configDescriptions[i];
+		}
+		DB_Results.setConfigs(this.configNames);
+		DB_Results.setConfigDescriptions(this.configDescriptions);
+
+		// Write builds info
+		length = stream.readInt();
+		println("		+ "+length+" builds");
+		this.allBuildNames = new String[length];
+		for (int i = 0; i < length; i++) {
+			this.allBuildNames[i] = stream.readUTF();
+		}
+
+		// Write scenarios info
+		length = stream.readInt();
+		println("		+ "+length+" components");
+		this.components = new String[length];
+		this.allScenarios = new HashMap();
+		for (int i = 0; i < length; i++) {
+			this.components[i] = stream.readUTF();
+			int size = stream.readInt();
+			List scenarios = new ArrayList(size);
+			for (int j=0; j<size; j++) {
+				scenarios.add(new ScenarioResults(stream.readInt(), stream.readUTF(), stream.readUTF()));
+			}
+			this.allScenarios.put(this.components[i], scenarios);
+		}
+		println("	=> read from file "+dataFile); //$NON-NLS-1$
+	} catch (IOException ioe) {
+		println("	!!! "+dataFile+" should be deleted as it contained invalid data !!!"); //$NON-NLS-1$ //$NON-NLS-2$
+	} finally {
+		try {
+	        stream.close();
+        } catch (IOException e) {
+	        // nothing else to do!
+        }
+	}
 }
 
 private int readScenarios(String buildName, SubMonitor subMonitor) throws OperationCanceledException {
@@ -495,6 +622,7 @@
 	print("	+ get "+titleSuffix); //$NON-NLS-1$
 	subMonitor.subTask("Get "+titleSuffix); //$NON-NLS-1$
 	this.allScenarios = DB_Results.queryAllScenarios(this.scenarioPattern, buildName);
+	if (this.allScenarios == null) return -1;
 	int allScenariosSize = 0;
 	List componentsSet = new ArrayList(this.allScenarios.keySet());
 	Collections.sort(componentsSet);
@@ -511,16 +639,19 @@
 	return allScenariosSize;
 }
 
-private void reset() {
+void reset(File dataDir) {
 	this.allBuildNames = null;
 	this.children = new ArrayList();
-	this.name = null;
+//	this.name = null;
 	this.components = null;
+	this.allScenarios = null;
+	readLocalFile(dataDir);
 }
 
 private void setAllBuildNames() {
-	SortedSet builds = new TreeSet(new BuildDateComparator());
+	SortedSet builds = new TreeSet(Util.BUILD_DATE_COMPARATOR);
 	int size = size();
+	if (size == 0) return;
 	for (int i=0; i<size; i++) {
 		ComponentResults componentResults = (ComponentResults) this.children.get(i);
 		Set names = componentResults.getAllBuildNames();
@@ -539,22 +670,21 @@
 }
 
 private void setConfigInfo(String[][] configs) {
-	if (configs == null) {
-		this.configNames = DB_Results.getConfigs();
-		this.sortedConfigNames = DB_Results.getConfigs();
-		this.configDescriptions = DB_Results.getConfigDescriptions();
-	} else {
-		int length = configs.length;
-		this.configNames = new String[length];
-		this.sortedConfigNames = new String[length];
-		this.configDescriptions = new String[length];
-		for (int i=0; i<length; i++) {
-			this.configNames[i] = this.sortedConfigNames[i] = configs[i][0];
-			this.configDescriptions[i] = configs[i][1];
-		}
+	if (configs == null) return;
+
+	// Store config information
+	int length = configs.length;
+	this.configNames = new String[length];
+	this.sortedConfigNames = new String[length];
+	this.configDescriptions = new String[length];
+	for (int i=0; i<length; i++) {
+		this.configNames[i] = this.sortedConfigNames[i] = configs[i][0];
+		this.configDescriptions[i] = configs[i][1];
 	}
+
+	// Sort the config names
 	Arrays.sort(this.sortedConfigNames);
-	int length = this.sortedConfigNames.length;
+	length = this.sortedConfigNames.length;
 	this.sortedConfigDescriptions = new String[length];
 	for (int i=0; i<length; i++) {
 		for (int j=0; j<length; j++) {
@@ -583,8 +713,13 @@
 		setAllBuildNames();
 		if (this.name == null) { // does not know any build
 			this.name = DB_Results.getLastCurrentBuild();
-			if (this.name == null) {
-				throw new RuntimeException("Cannot find any current build!"); //$NON-NLS-1$
+			if (this.dbRequired) {
+				if (this.name == null) {
+					throw new RuntimeException("Cannot find any current build!"); //$NON-NLS-1$
+				}
+				this.allBuildNames = DB_Results.getBuilds();
+				this.components = DB_Results.getComponents();
+				initConfigs();
 			}
 			if (this.printStream != null) {
 				this.printStream.println("	+ no build specified => use last one: "+this.name); //$NON-NLS-1$
@@ -593,10 +728,10 @@
 	}
 
 	// Init baseline name if not set
-	if (this.baselineName == null) {
+	if (this.baselineName == null && getName() != null) {
 		String buildDate = Util.getBuildDate(getName());
 		this.baselineName = DB_Results.getLastBaselineBuild(buildDate);
-		if (this.baselineName == null) {
+		if (this.baselineName == null && this.dbRequired) {
 			throw new RuntimeException("Cannot find any baseline to refer!"); //$NON-NLS-1$
 		}
 		if (this.printStream != null) {
@@ -605,7 +740,7 @@
 	}
 
 	// Init baseline prefix if not set
-	if (this.baselinePrefix == null) {
+	if (this.baselinePrefix == null && this.baselineName != null) {
 		// Assume that baseline name format is *always* x.y_yyyyMMddhhmm_yyyyMMddhhmm
 		int index = this.baselineName.lastIndexOf('_');
 		if (index > 0) {
@@ -646,7 +781,7 @@
 	switch (length) {
 		case 0:
 			buffer.append("all builds"); //$NON-NLS-1$
-			reset();
+			reset(dataDir);
 			break;
 		case 1:
 			buffer.append("one build"); //$NON-NLS-1$
@@ -688,7 +823,7 @@
 	StringBuffer buffer = new StringBuffer("Update data for "); //$NON-NLS-1$
 	if (buildName == null) {
 		buffer.append("all builds"); //$NON-NLS-1$
-		reset();
+		reset(dataDir);
 	} else {
 		buffer.append("one build"); //$NON-NLS-1$
 	}
@@ -711,4 +846,74 @@
 	return this.allBuildNames;
 }
 
+/*
+ * Write general information.
+ */
+void writeData(File dir) {
+	if (dir ==null || (!dir.exists() && !dir.mkdirs())) {
+		System.err.println("can't create directory " + dir); //$NON-NLS-1$
+		return;
+	}
+	File dataFile = new File(dir, "performances.dat"); //$NON-NLS-1$
+	if (dataFile.exists()) {
+		if (this.updateLocalFileNeed) {
+			dataFile.delete();
+		} else {
+			return;
+		}
+	} else if (!DB_Results.DB_CONNECTION) {
+		// Only write new local file if there's a database connection
+		// otherwise contents may not be complete...
+		return;
+	}
+	try {
+		DataOutputStream stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
+
+		// Write build info
+		stream.writeUTF(this.name == null ? DB_Results.getLastCurrentBuild() : this.name);
+		stream.writeUTF(this.baselineName == null ? DB_Results.getLastBaselineBuild(null) : this.baselineName);
+		stream.writeUTF(this.baselinePrefix == null ? "" : this.baselinePrefix);
+
+		// Write configs info
+		int length = this.sortedConfigNames.length;
+		stream.writeInt(length);
+		for (int i = 0; i < length; i++) {
+			stream.writeUTF(this.sortedConfigNames[i]);
+			stream.writeUTF(this.sortedConfigDescriptions[i]);
+		}
+
+		// Write builds info
+		String[] builds = this.allBuildNames == null ? DB_Results.getBuilds() : this.allBuildNames;
+		length = builds.length;
+		stream.writeInt(length);
+		for (int i = 0; i < length; i++) {
+			stream.writeUTF(builds[i]);
+		}
+
+		// Write scenarios info
+		length = this.components.length;
+		stream.writeInt(length);
+		for (int i = 0; i < length; i++) {
+			stream.writeUTF(this.components[i]);
+			List scenarios = (List) this.allScenarios.get(this.components[i]);
+			int size = scenarios.size();
+			stream.writeInt(size);
+			for (int j=0; j<size; j++) {
+				final ScenarioResults scenarioResults = (ScenarioResults)scenarios.get(j);
+				stream.writeInt(scenarioResults.getId());
+				stream.writeUTF(scenarioResults.getName());
+				stream.writeUTF(scenarioResults.getLabel());
+			}
+		}
+
+		// Close
+		stream.close();
+		println("	=> performance results general data  written in file " + dataFile); //$NON-NLS-1$
+	} catch (FileNotFoundException e) {
+		System.err.println("can't create output file" + dataFile); //$NON-NLS-1$
+	} catch (IOException e) {
+		e.printStackTrace();
+	}
+}
+
 }
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsElement.java
index e03e814..d583c3f 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsElement.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/BuildResultsElement.java
@@ -171,13 +171,7 @@
 		return new Object[0];
 	}
 	if (this.children == null) {
-		BuildResults buildResults = (BuildResults) this.results;
-		Dim[] dimensions = buildResults.getDimensions();
-		int length = dimensions.length;
-		this.children = new DimResultsElement[length];
-		for (int i=0; i<length; i++) {
-			this.children[i] = new DimResultsElement(this.results, this, dimensions[i]);
-		}
+		initChildren();
 	}
 	return this.children;
 }
@@ -280,6 +274,16 @@
 	return super.getPropertyValue(propKey);
 }
 
+void initChildren() {
+	BuildResults buildResults = (BuildResults) this.results;
+	Dim[] dimensions = buildResults.getDimensions();
+	int length = dimensions.length;
+	this.children = new DimResultsElement[length];
+	for (int i=0; i<length; i++) {
+		this.children[i] = new DimResultsElement(this.results, this, dimensions[i]);
+	}
+}
+
 /*
  * Init information
  */
@@ -290,7 +294,7 @@
 
 void initStatus() {
 	if (this.results == null) {
-		if (this.parent.results != null) {
+		if (this.parent.isInitialized()) {
 			if (((PerformanceResultsElement) this.parent).hasRead(this)) {
 				this.status = READ;
 			} else {
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/PerformanceResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/PerformanceResultsElement.java
index b169bbe..ffe3e9c 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/PerformanceResultsElement.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/PerformanceResultsElement.java
@@ -12,8 +12,6 @@
 
 import java.io.File;
 import java.util.Arrays;
-import java.util.Comparator;
-
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.test.internal.performance.results.db.*;
 import org.eclipse.test.internal.performance.results.utils.Util;
@@ -35,13 +33,16 @@
 }
 
 public String[] getBaselines() {
-	String[] builds = DB_Results.getBuilds();
-	int length = builds.length;
+	getBuildNames();
+	if (this.buildNames == null) {
+		return new String[0];
+	}
+	int length = this.buildNames.length;
 	String[] baselines = new String[length];
 	int count = 0;
 	for (int i=0; i<length; i++) {
-		if (builds[i].startsWith("R-")) {
-			baselines[count++] = builds[i];
+		if (this.buildNames[i].startsWith("R-")) {
+			baselines[count++] = this.buildNames[i];
 		}
 	}
 	if (count < length) {
@@ -52,23 +53,27 @@
 
 String[] getBuildNames() {
 	if (this.buildNames == null) {
-		this.buildNames = this.results == null ? new String[0] : getPerformanceResults().getAllBuildNames();
+		this.buildNames = DB_Results.DB_CONNECTION
+			? DB_Results.getBuilds()
+			: this.results == null
+				? new String[0]
+				: getPerformanceResults().getAllBuildNames();
 	}
 	return this.buildNames;
 }
 
 public Object[] getBuilds() {
-	String[] builds = DB_Results.getBuilds();
-	int length = builds.length;
+	getBuildNames();
+	int length = this.buildNames == null ? 0 : this.buildNames.length;
 	BuildResultsElement[] elements = new BuildResultsElement[length];
 	for (int i=0; i<length; i++) {
-		elements[i] = new BuildResultsElement(builds[i], this);
+		elements[i] = new BuildResultsElement(this.buildNames[i], this);
 	}
 	return elements;
 }
 
 public String[] getComponents() {
-	if (this.results == null) {
+	if (!isInitialized()) {
 		String[] components = DB_Results.getComponents();
 		int length = components.length;
 		if (length == 0) {
@@ -77,11 +82,47 @@
 		}
 		return components;
 	}
-	return ((PerformanceResults) this.results).getComponents();
+	return getPerformanceResults().getComponents();
+}
+
+/**
+ * Returns the names of the configurations.
+ *
+ * @return An array of String
+ */
+public String[] getConfigs() {
+	if (!isInitialized()) {
+		String[] configs = DB_Results.getConfigs();
+		int length = configs.length;
+		if (length == 0) {
+			DB_Results.queryAllScenarios();
+			configs = DB_Results.getConfigs();
+		}
+		return configs;
+	}
+	return getPerformanceResults().getConfigNames(false);
+}
+
+/**
+ * Returns the descriptions of the configurations.
+ *
+ * @return An array of String
+ */
+public String[] getConfigDescriptions() {
+	if (!isInitialized()) {
+		String[] descriptions = DB_Results.getConfigDescriptions();
+		int length = descriptions.length;
+		if (length == 0) {
+			DB_Results.queryAllScenarios();
+			descriptions = DB_Results.getConfigDescriptions();
+		}
+		return descriptions;
+	}
+	return getPerformanceResults().getConfigBoxes(false);
 }
 
 public Object[] getElements() {
-	if (this.results == null) {
+	if (!isInitialized()) {
 		String[] components = getComponents();
 		int length = components.length;
 		ComponentResultsElement[] elements = new ComponentResultsElement[length];
@@ -98,45 +139,46 @@
 }
 
 boolean hasRead(BuildResultsElement buildResultsElement) {
-	String[] builds = getBuildNames();
-	if (Arrays.binarySearch(builds, buildResultsElement.getName(),
-		new Comparator() {
-		public int compare(Object o1, Object o2) {
-	        String s1 = (String) o1;
-	        String s2 = (String) o2;
-	        return Util.getBuildDate(s1).compareTo(Util.getBuildDate(s2));
-	    }
-	}) < 0) {
+	String[] builds = this.results == null ? getBuildNames() : getPerformanceResults().getAllBuildNames();
+	if (Arrays.binarySearch(builds, buildResultsElement.getName(), Util.BUILD_DATE_COMPARATOR) < 0) {
 		return false;
 	}
 	return true;
 }
 
+public boolean isInitialized() {
+	return super.isInitialized() && this.results.size() > 0;
+}
+
 public void readLocal(File dataDir, IProgressMonitor monitor) {
-	this.results = new PerformanceResults(null, null, null, System.out);
-	reset();
+	reset(null);
 	getPerformanceResults().readLocal(dataDir, monitor);
 }
 
-public void reset() {
+public void reset(String buildName) {
+	if (buildName == null) {
+		this.results = new PerformanceResults(System.out);
+	} else {
+		this.results = new PerformanceResults(buildName, null, null, System.out);
+	}
 	this.children = null;
 	this.buildNames = null;
 }
 
+public void resetBuildNames() {
+	this.buildNames = null;
+}
+
 public void updateBuild(String buildName, boolean force, File dataDir, IProgressMonitor monitor) {
 	if (this.results == null) {
-//		throw new IllegalArgumentException("Unexpected null results!");
-		this.results = new PerformanceResults(buildName, null, null, System.out);
-		reset();
+		reset(buildName);
 	}
 	getPerformanceResults().updateBuild(buildName, force, dataDir, monitor);
 }
 
 public void updateBuilds(String[] builds, boolean force, File dataDir, IProgressMonitor monitor) {
 	if (this.results == null) {
-//		throw new IllegalArgumentException("Unexpected null results!");
-		this.results = new PerformanceResults(null, null, null, System.out);
-		reset();
+		reset(null);
 	}
 	getPerformanceResults().updateBuilds(builds, force, dataDir, monitor);
 }
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ResultsElement.java
index 9a7ea50..4cda1c9 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ResultsElement.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ResultsElement.java
@@ -52,6 +52,7 @@
 	public static final Image HELP_IMAGE = WORKBENCH_SHARED_IMAGES.getImage(ISharedImages.IMG_LCL_LINKTO_HELP);
 	public static final ImageDescriptor HELP_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_LCL_LINKTO_HELP);
 	public static final ImageDescriptor FOLDER_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER);
+	public static final ImageDescriptor CONNECT_IMAGE_DESCRIPTOR = WORKBENCH_SHARED_IMAGES.getImageDescriptor(ISharedImages.IMG_ELCL_SYNCED);
 
 	// Model
     ResultsElement parent;
@@ -414,7 +415,7 @@
 	return (getStatus() & ERROR_MASK) != 0;
 }
 
-private void initChildren() {
+void initChildren() {
 	AbstractResults[] resultsChildren = this.results.getChildren();
 	int length = resultsChildren.length;
 	this.children = new ResultsElement[length];
@@ -495,6 +496,10 @@
 	return this.status;
 }
 
+public boolean isInitialized() {
+	return this.results != null;
+}
+
 /* (non-Javadoc)
  * Method declared on IPropertySource
  */
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
index f70fde8..2a7039a 100644
--- 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
@@ -40,12 +40,11 @@
 import org.eclipse.swt.widgets.Composite;
 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.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.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
 import org.eclipse.ui.model.WorkbenchContentProvider;
 import org.eclipse.ui.model.WorkbenchLabelProvider;
@@ -69,7 +68,7 @@
 		public void run() {
 
 			// Ask for output directory
-			String resultGenerationDir = BuildsView.this.preferences.get(IPerformancesConstants.PRE_RESULTS_GENERATION_DIR, IPerformancesConstants.DEFAULT_RESULTS_GENERATION_DIR);
+			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) {
@@ -190,7 +189,7 @@
 	 */
 	class UpdateBuildAction extends Action {
 
-		final boolean force;
+		boolean force;
 
 		UpdateBuildAction(boolean force) {
 			super();
@@ -201,8 +200,10 @@
 
 			// Verify that directories are set
 			if (BuildsView.this.dataDir == 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;
+				if (changeDataDir() == 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;
+					}
 				}
 			}
 
@@ -227,17 +228,12 @@
 			}
 
 			// Reset Components and Builds views input
-			resetInput();
-			getSiblingView().resetInput();
+			refreshInput();
+			getSiblingView().refreshInput();
 		}
 
 		void updateBuilds(IProgressMonitor monitor) {
-			int length = BuildsView.this.buildsResults.length;
-			String[] builds = new String[length];
-			for (int i = 0; i < length; i++) {
-				builds[i] = BuildsView.this.buildsResults[i].getName();
-			}
-			BuildsView.this.results.updateBuilds(builds, this.force, BuildsView.this.dataDir, monitor);
+			BuildsView.this.updateBuilds(monitor, this.force);
 		}
 	}
 
@@ -252,24 +248,14 @@
 		UpdateAllBuildsAction(boolean force) {
 			super(force);
 		}
-
-		public boolean isEnabled() {
-			if (this.force) {
-				return true;
-			}
-			String[] elements = buildsToUpdate();
-			return elements != null;
-		}
+//
+//		public boolean isEnabled() {
+//			String[] elements = buildsToUpdate();
+//			return elements != null;
+//		}
 
 		void updateBuilds(IProgressMonitor monitor) {
-			if (this.force) {
-				BuildsView.this.results.updateBuild(null, this.force, BuildsView.this.dataDir, monitor);
-			} else {
-				String[] builds = buildsToUpdate();
-				if (builds != null) {
-					BuildsView.this.results.updateBuilds(builds, this.force, BuildsView.this.dataDir, monitor);
-				}
-			}
+			BuildsView.this.updateAllBuilds(monitor, this.force);
 		}
 	}
 
@@ -298,7 +284,7 @@
 	// Actions
 	Action generate;
 	UpdateBuildAction updateBuild, updateAllBuilds;
-	UpdateBuildAction forceUpdateBuild, forceUpdateAllBuilds;
+//	UpdateBuildAction forceUpdateBuild, forceUpdateAllBuilds;
 
 	// SWT resources
 	Font italicFont;
@@ -396,6 +382,7 @@
 	this.viewer.setSorter(nameSorter);
 
 	// Finalize viewer initialization
+	PlatformUI.getWorkbench().getHelpSystem().setHelp(this.viewer.getControl(), "org.eclipse.test.performance.ui.builds");
 	finalizeViewerCreation();
 }
 
@@ -417,21 +404,17 @@
 	super.fillContextMenu(manager);
 	manager.add(this.generate);
 	manager.add(this.updateBuild);
-	manager.add(this.forceUpdateBuild);
-	// Other plug-ins can contribute there actions here
-	manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+//	manager.add(this.forceUpdateBuild);
 }
 
 /*
- * (non-Javadoc)
- * @see org.eclipse.test.internal.performance.results.ui.PerformancesView#fillLocalPullDown(org.eclipse.jface.action.IMenuManager)
+ * Fill the local data drop-down menu
  */
-void fillLocalPullDown(IMenuManager manager) {
-	super.fillLocalPullDown(manager);
+void fillLocalDataDropDown(IMenuManager manager) {
+	super.fillLocalDataDropDown(manager);
 	manager.add(new Separator());
 	manager.add(this.updateAllBuilds);
-	manager.add(this.forceUpdateAllBuilds);
-	manager.add(new Separator());
+//	manager.add(this.forceUpdateAllBuilds);
 }
 
 /*
@@ -439,7 +422,7 @@
  */
 Object[] getBuilds() {
 	if (this.results == null) {
-		this.results = PerformanceResultsElement.PERF_RESULTS_MODEL;
+		initResults();
 	}
 	return this.results.getBuilds();
 }
@@ -464,19 +447,22 @@
 
 	// Generate action
 	this.generate = new GenerateAction();
-	this.generate.setText("Generate");
+	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");
-	this.forceUpdateBuild = new UpdateBuildAction(true);
-	this.forceUpdateBuild.setText("Force Update");
+	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 all");
-	this.forceUpdateAllBuilds = new UpdateAllBuildsAction(true);
-	this.forceUpdateAllBuilds.setText("Force Update all");
+	this.updateAllBuilds.setText("&Update from DB (all)");
+	this.updateAllBuilds.setEnabled(connected);
+//	this.forceUpdateAllBuilds = new UpdateAllBuildsAction(true);
+//	this.forceUpdateAllBuilds.setText("Force Update all");
 
 	// Set filters default
 	this.filterBaselineBuilds.setChecked(false);
@@ -486,18 +472,59 @@
 /**
  * Reset the views.
  */
-public void resetViews() {
-	// Close DB connexion
-	DB_Results.shutdown();
+public void resetView() {
 
-	// Reset views content
-	resetInput();
-	getSiblingView().resetInput();
-
-	// May be read local data now
-	if (MessageDialog.openQuestion(this.shell, getTitleToolTip(), "Do you want to read local data right now?")) {
-		changeDataDir();
+	// 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);
+	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 (sameConnection && sameDB) {
+		// No database preferences has changed do nothing
+		return;
 	}
+
+	// Update database constants
+	boolean updated = DB_Results.updateDbConstants(connected, eclipseVersion, databaseLocation);
+	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) {
+		StringBuffer message = new StringBuffer("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();
+	getSiblingView().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();
+		getSiblingView().resetInput();
+
+		// May be read local data now
+		if (MessageDialog.openQuestion(this.shell, getTitleToolTip(), "Do you want to read local data right now?")) {
+			changeDataDir();
+		} else {
+			this.dataDir = null;
+			getSiblingView().dataDir = null;
+		}
+	}
+
+	// Update actions
+	this.updateBuild.setEnabled(connected);
+	this.updateAllBuilds.setEnabled(connected);
 }
 
 /*
@@ -514,7 +541,10 @@
 		Object[] elements = ((IStructuredSelection)selection).toArray();
 		length = elements == null ? 0 : elements.length;
 		this.buildsResults = new BuildResultsElement[length];
-		if (length == 0) return;
+		if (length == 0) {
+			this.updateAllBuilds.setText("&Update from DB (all)");
+			return;
+		}
 		for (int i=0; i<length; i++) {
 			this.buildsResults[i] = (BuildResultsElement) elements[i];
 		}
@@ -523,26 +553,59 @@
 	}
 
 	// Update update build action
-	boolean enableUpdateBuild = true;
-	boolean enableGenerate = true;
+//	boolean enableUpdateBuild = true;
+//	boolean enableGenerate = true;
+	int readBuilds = 0;
 	for (int i=0; i<length; i++) {
 		if (this.buildsResults[i].isRead()) {
-			enableUpdateBuild = false;
+//			enableUpdateBuild = false;
+			readBuilds++;
 		} else {
-			enableGenerate = false;
+//			enableGenerate = false;
 		}
 	}
-	this.updateBuild.setEnabled(enableUpdateBuild);
-	this.forceUpdateBuild.setEnabled(!enableUpdateBuild);
+//	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
-	for (int i=0; i<length; i++) {
-		if (this.buildsResults[i].getName().startsWith(DB_Results.getDbBaselinePrefix())) {
-			enableGenerate = false;
-			break;
+	boolean enableGenerate = !force;
+	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();
+	}
+	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();
+	}
+	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);
+}
+
 }
\ 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
index 9b66462..cddbc4b 100644
--- 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
@@ -20,6 +20,7 @@
 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;
@@ -30,12 +31,13 @@
 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.db.DB_Results;
 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;
@@ -43,6 +45,7 @@
 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;
 
 
@@ -89,8 +92,8 @@
 
 	// Action
 	Action fullLineSelection;
-	Action filterNonFingerprints;
-	Action filterNonImportantBuilds;
+	Action filterAdvancedScenarios;
+	Action filterOldBuilds;
 	Action filterNightlyBuilds;
 	ImageDescriptor fullSelectionImageDescriptor;
 
@@ -130,12 +133,17 @@
 	this.tabFolder = new CTabFolder(parent, SWT.BORDER);
 
 	// Add results view as listener to viewer selection changes
-	PerformancesView performancesView = (PerformancesView) PerformancesView.getWorkbenchView("org.eclipse.test.internal.performance.results.ui.ComponentsView");
-	if (performancesView != null) {
-		performancesView.viewer.addSelectionChangedListener(this);
-	}
+	Display.getDefault().asyncExec(new Runnable() {
+		public void run() {
+			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();
 
@@ -154,8 +162,10 @@
  * The list of these machines is got from the DB_Results contants.
  */
 void createTabs() {
-	String[] configNames = DB_Results.getConfigs();
-	String[] configDescriptions = DB_Results.getConfigDescriptions();
+	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++) {
@@ -185,16 +195,25 @@
 }
 
 /*
- * Fill the local pull-down menu with:
+ * Fill the filters drop-down menu with:
  * 	- filter nightly builds
  * 	- filter non-milestone builds
  *	- filter non-fingerprint scenarios
  */
-void fillLocalPullDown(IMenuManager manager) {
+void fillFiltersDropDown(IMenuManager manager) {
 	manager.add(this.filterNightlyBuilds);
-	manager.add(this.filterNonImportantBuilds);
+	manager.add(this.filterOldBuilds);
 	manager.add(new Separator());
-	manager.add(this.filterNonFingerprints);
+	manager.add(this.filterAdvancedScenarios);
+}
+
+/*
+ * Fill the local pull down menu.
+ */
+void fillLocalPullDown(IMenuManager manager) {
+	MenuManager filtersManager= new MenuManager("Filters");
+	fillFiltersDropDown(filtersManager);
+	manager.add(filtersManager);
 }
 
 /*
@@ -231,36 +250,36 @@
 	};
 	this.fullLineSelection.setImageDescriptor(this.fullSelectionImageDescriptor);
 	this.fullLineSelection.setToolTipText("Full line selection");
-	this.fullLineSelection.setChecked(true);
+//	this.fullLineSelection.setChecked(true);
 
 	// Filter non-fingerprints action
-	this.filterNonFingerprints = new Action("Filter non-fingerprint scenarios", IAction.AS_CHECK_BOX) {
+	this.filterAdvancedScenarios = new Action("Advanced &Scenarios", IAction.AS_CHECK_BOX) {
 		public void run() {
-			ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_NON_FINGERPRINT_SCENARIOS, isChecked());
+			ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, isChecked());
 			resetTabFolders(false/*refresh*/);
         }
 	};
-	this.filterNonFingerprints.setChecked(true);
-	this.filterNonFingerprints.setToolTipText("Show only fingerprints scenarios");
+	this.filterAdvancedScenarios.setChecked(true);
+	this.filterAdvancedScenarios.setToolTipText("Filter advanced scenarios (i.e. not fingerprint ones)");
 
 	// Filter non-important builds action
-	this.filterNonImportantBuilds = new Action("Filter non-important builds", IAction.AS_CHECK_BOX) {
+	this.filterOldBuilds = new Action("&Old Builds", IAction.AS_CHECK_BOX) {
 		public void run() {
-			ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_NON_MILESTONES_BUILDS, isChecked());
+			ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, isChecked());
 			resetTabFolders(false/*refresh*/);
 		}
 	};
-	this.filterNonImportantBuilds.setChecked(false);
-	this.filterNonImportantBuilds.setToolTipText("Show only important builds (i.e. milestones and recent builds)");
+	this.filterOldBuilds.setChecked(false);
+	this.filterOldBuilds.setToolTipText("Filter old builds (i.e. before last milestone) but keep all previous milestones)");
 
-	// Filter baselines action
-	this.filterNightlyBuilds = new Action("Filter nightly builds", IAction.AS_CHECK_BOX) {
+	// Filter nightly action
+	this.filterNightlyBuilds = new Action("&Nightly", IAction.AS_CHECK_BOX) {
 		public void run() {
 			ComponentResultsView.this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_NIGHTLY_BUILDS, isChecked());
 			resetTabFolders(false/*refresh*/);
 		}
 	};
-	this.filterNightlyBuilds.setToolTipText("Do not show nightly builds in table");
+	this.filterNightlyBuilds.setToolTipText("Filter nightly builds");
 }
 
 /* (non-Javadoc)
@@ -271,16 +290,16 @@
 	Object newValue = event.getNewValue();
 
 	// Filter non-fingerprints change
-	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_NON_FINGERPRINT_SCENARIOS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_NON_FINGERPRINT_SCENARIOS : "true".equals(newValue);
-		this.filterNonFingerprints.setChecked(checked);
+	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_NON_MILESTONES_BUILDS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_NON_MILESTONES_BUILDS : "true".equals(newValue);
-		this.filterNonImportantBuilds.setChecked(checked);
+	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*/);
 	}
 
@@ -359,21 +378,21 @@
 	// Filter baselines action state
 	if (this.viewState != null) {
 		Boolean state = this.viewState.getBoolean(IPerformancesConstants.PRE_FULL_LINE_SELECTION);
-		boolean fullLine = state == null ? false : state.booleanValue();
+		boolean fullLine = state == null ? true : state.booleanValue();
 		this.fullLineSelection.setChecked(fullLine);
 	}
 
 	// Filter non fingerprints action state
-	boolean checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NON_FINGERPRINT_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_NON_FINGERPRINT_SCENARIOS);
-	this.filterNonFingerprints.setChecked(checked);
+	boolean checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
+	this.filterAdvancedScenarios.setChecked(checked);
 
 	// Filter nightly builds action
 	checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NIGHTLY_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NIGHTLY_BUILDS);
 	this.filterNightlyBuilds.setChecked(checked);
 
 	// Filter non important builds action state
-	checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NON_MILESTONES_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NON_MILESTONES_BUILDS);
-	this.filterNonImportantBuilds.setChecked(checked);
+	checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS);
+	this.filterOldBuilds.setChecked(checked);
 }
 
 /*
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
index 58d4485..3f92f4d 100644
--- 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
@@ -33,14 +33,15 @@
 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.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.PlatformUI;
 import org.eclipse.ui.model.WorkbenchContentProvider;
 import org.eclipse.ui.model.WorkbenchLabelProvider;
 
@@ -76,7 +77,7 @@
 public class ComponentsView extends PerformancesView {
 
 	// Viewer filters
-	final static ViewerFilter FILTER_NON_FINGERPRINT_SCENARIOS = new ViewerFilter() {
+	final static ViewerFilter FILTER_ADVANCED_SCENARIOS = new ViewerFilter() {
 		public boolean select(Viewer v, Object parentElement, Object element) {
 			if (element instanceof ScenarioResultsElement) {
 				ScenarioResultsElement scenarioElement = (ScenarioResultsElement) element;
@@ -85,15 +86,6 @@
 	        return true;
         }
 	};
-	final static ViewerFilter FILTER_NON_MILESTONE_BUILDS = new ViewerFilter() {
-		public boolean select(Viewer v, Object parentElement, Object element) {
-			if (element instanceof BuildResultsElement) {
-				BuildResultsElement buildElement = (BuildResultsElement) element;
-				return buildElement.isImportant();
-			}
-	        return true;
-        }
-	};
 
 	// Views
 	PerformancesView buildsView;
@@ -103,12 +95,10 @@
 	Set expandedComponents = new HashSet();
 
 	// Actions
-	Action filterNonFingerprints;
-	Action filterNonImportantBuilds;
+	Action filterAdvancedScenarios;
 
 	// SWT resources
 	Font boldFont;
-//	ImageDescriptor onlyFingerprintsImageDescriptor;
 
 /**
  * Default constructor.
@@ -155,7 +145,7 @@
 			if (element instanceof ScenarioResultsElement) {
 //				Action fingerprints = ComponentsView.this.filterNonFingerprints;
 //				if (fingerprints != null && !fingerprints.isChecked()) {
-				boolean fingerprints = ComponentsView.this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NON_FINGERPRINT_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_NON_FINGERPRINT_SCENARIOS);
+				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()) {
@@ -195,12 +185,17 @@
 	this.viewer.setSorter(nameSorter);
 
 	// Add results view as listener to viewer selection changes
-	ISelectionChangedListener listener = getResultsView();
-	if (listener != null) {
-		this.viewer.addSelectionChangedListener(listener);
-	}
+	Display.getDefault().asyncExec(new Runnable() {
+		public void run() {
+			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();
 }
 
@@ -220,11 +215,11 @@
  * (non-Javadoc)
  * @see org.eclipse.test.internal.performance.results.ui.PerformancesView#fillLocalPullDown(org.eclipse.jface.action.IMenuManager)
  */
-void fillLocalPullDown(IMenuManager manager) {
-	super.fillLocalPullDown(manager);
-	manager.add(this.filterNonImportantBuilds);
+void fillFiltersDropDown(IMenuManager manager) {
+	super.fillFiltersDropDown(manager);
+	manager.add(this.filterOldBuilds);
 	manager.add(new Separator());
-	manager.add(this.filterNonFingerprints);
+	manager.add(this.filterAdvancedScenarios);
 }
 
 /*
@@ -238,27 +233,14 @@
 /*
  * Filter non fingerprints scenarios action run.
  */
-void filterNonFingerprints(boolean fingerprints, boolean updatePreference) {
+void filterAdvancedScenarios(boolean fingerprints, boolean updatePreference) {
 	this.results.setFingerprints(fingerprints);
 	if (fingerprints) {
-		this.viewFilters.add(FILTER_NON_FINGERPRINT_SCENARIOS);
+		this.viewFilters.add(FILTER_ADVANCED_SCENARIOS);
 	} else {
-		this.viewFilters.remove(FILTER_NON_FINGERPRINT_SCENARIOS);
+		this.viewFilters.remove(FILTER_ADVANCED_SCENARIOS);
 	}
-	this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_NON_FINGERPRINT_SCENARIOS, fingerprints);
-	updateFilters();
-}
-
-/*
- * Filter non milestone builds action run.
- */
-void filterNonMilestoneBuilds(boolean filter, boolean updatePreference) {
-	if (filter) {
-		this.viewFilters.add(FILTER_NON_MILESTONE_BUILDS);
-	} else {
-		this.viewFilters.remove(FILTER_NON_MILESTONE_BUILDS);
-	}
-	this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_NON_MILESTONES_BUILDS, filter);
+	this.preferences.putBoolean(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS, fingerprints);
 	updateFilters();
 }
 
@@ -279,9 +261,9 @@
  */
 Object[] getElements() {
 	if (this.results == null) {
-		this.results = PerformanceResultsElement.PERF_RESULTS_MODEL;
-		if (this.filterNonFingerprints != null) {
-			this.results.setFingerprints(this.filterNonFingerprints.isChecked());
+		initResults();
+		if (this.filterAdvancedScenarios != null) {
+			this.results.setFingerprints(this.filterAdvancedScenarios.isChecked());
 		}
 	}
 	return this.results.getElements();
@@ -316,23 +298,13 @@
 	super.makeActions();
 
 	// Filter non-fingerprints action
-	this.filterNonFingerprints = new Action("Filter non-fingerprint scenarios", IAction.AS_CHECK_BOX) {
+	this.filterAdvancedScenarios = new Action("Advanced &Scenarios", IAction.AS_CHECK_BOX) {
 		public void run() {
-			filterNonFingerprints(isChecked(), true/*update preference*/);
+			filterAdvancedScenarios(isChecked(), true/*update preference*/);
         }
 	};
-	this.filterNonFingerprints.setChecked(true);
-	this.filterNonFingerprints.setToolTipText("Show only fingerprints scenarios in the hierarchy");
-//	this.filterNonFingerprints.setImageDescriptor(this.onlyFingerprintsImageDescriptor);
-
-	// Filter non-important builds action
-	this.filterNonImportantBuilds = new Action("Filter non-important builds", IAction.AS_CHECK_BOX) {
-		public void run() {
-			filterNonMilestoneBuilds(isChecked(), true/*update preference*/);
-		}
-	};
-	this.filterNonImportantBuilds.setChecked(false);
-	this.filterNonImportantBuilds.setToolTipText("Show only important builds (i.e. milestones and recent builds)");
+	this.filterAdvancedScenarios.setChecked(true);
+	this.filterAdvancedScenarios.setToolTipText("Filter advanced scenarios (i.e. not fingerprint ones)");
 
 	// Set filters default
 	this.filterBaselineBuilds.setChecked(true);
@@ -347,17 +319,17 @@
 	Object newValue = event.getNewValue();
 
 	// Filter non-fingerprints change
-	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_NON_FINGERPRINT_SCENARIOS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_NON_FINGERPRINT_SCENARIOS : "true".equals(newValue);
-		filterNonFingerprints(checked, false/*do not update preference*/);
-		this.filterNonFingerprints.setChecked(checked);
+	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_ADVANCED_SCENARIOS)) {
+		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS : "true".equals(newValue);
+		filterAdvancedScenarios(checked, false/*do not update preference*/);
+		this.filterAdvancedScenarios.setChecked(checked);
 	}
 
 	// Filter non-milestone change
-	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_NON_MILESTONES_BUILDS)) {
-		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_NON_MILESTONES_BUILDS : "true".equals(newValue);
-		filterNonMilestoneBuilds(checked, false/*do not update preference*/);
-		this.filterNonImportantBuilds.setChecked(checked);
+	if (propertyName.equals(IPerformancesConstants.PRE_FILTER_OLD_BUILDS)) {
+		boolean checked = newValue == null ? IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS : "true".equals(newValue);
+		filterOldBuilds(checked, false/*do not update preference*/);
+		this.filterOldBuilds.setChecked(checked);
 	}
 
 	// Filter nightly builds change
@@ -378,17 +350,10 @@
 	}
 
 	// Filter non fingerprints action state
-	boolean checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NON_FINGERPRINT_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_NON_FINGERPRINT_SCENARIOS);
-	this.filterNonFingerprints.setChecked(checked);
+	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_NON_FINGERPRINT_SCENARIOS);
-	}
-
-	// Filter non important builds action state
-	checked = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NON_MILESTONES_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NON_MILESTONES_BUILDS);
-	this.filterNonImportantBuilds.setChecked(checked);
-	if (checked) {
-		this.viewFilters.add(FILTER_NON_MILESTONE_BUILDS);
+		this.viewFilters.add(FILTER_ADVANCED_SCENARIOS);
 	}
 }
 
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
index 7a0ca25..bf5230c 100644
--- 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
@@ -29,6 +29,7 @@
 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;
@@ -87,7 +88,7 @@
 	double[][] allErrors;
 
 	// Cells management
-	Point origin;
+	Point tableOrigin, tableSize;
 	int columnsCount, rowsCount;
 	List firstLine;
 
@@ -113,8 +114,8 @@
  */
 Composite createTabFolderPage (ComponentResultsElement componentResultsElement, CTabFolder tabFolder, boolean fullSelection) {
 	// Cache the shell and display.
-	this.shell = tabFolder.getShell ();
-	this.display = this.shell.getDisplay ();
+	this.shell = tabFolder.getShell();
+	this.display = this.shell.getDisplay();
 
 	// Remove old table is present
 	boolean initResources = this.table == null;
@@ -140,7 +141,7 @@
 	if (initResources) initResources();
 
 	// Add columns to the table
-	boolean fingerprints = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NON_FINGERPRINT_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_NON_FINGERPRINT_SCENARIOS);
+	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++) {
@@ -229,26 +230,42 @@
  * Get the current cell position (column, row) from a point position.
  */
 Point currentCellPosition(int x, int y) {
-	if (this.origin == null) {
-		this.origin = new Point(0, this.table.getHeaderHeight());
+
+	// Compute the origin of the visible area
+	if (this.tableOrigin == null) {
+		this.tableOrigin = new Point(0, this.table.getHeaderHeight());
 	}
-	int width = this.origin.x;
+
+	// 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;
-	while (col<this.columnsCount && width<x) {
-		width += this.table.getColumn(col++).getWidth();
+	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);
 	}
-	if (col == this.columnsCount && width<x) {
-		return null;
-	}
-	int heigth= this.origin.y;
-	int row = 0;
-	while (row<this.rowsCount && heigth<y) {
-		heigth += this.table.getItem(row++).getBounds().height+1;
-	}
-	if (row == this.rowsCount && heigth<y) {
-		return null;
-	}
-	return new Point(col-1, row-1);
+
+	// Return the found table cell position
+	return new Point(col, row);
 }
 
 /*
@@ -275,7 +292,7 @@
 		toolTip.dispose();
 	}
 	this.table.dispose();
-	this.origin = null;
+	this.tableOrigin = null;
 	this.firstLine = null;
 }
 
@@ -286,7 +303,7 @@
 private void fillTableLines(boolean fingerprints) {
 
 	// Get preferences information
-	boolean onlyMilestones = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NON_MILESTONES_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NON_MILESTONES_BUILDS);
+	boolean onlyMilestones = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_OLD_BUILDS, IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS);
 	boolean skipNightlyBuilds = this.preferences.getBoolean(IPerformancesConstants.PRE_FILTER_NIGHTLY_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NIGHTLY_BUILDS);
 
 	// Get model information
@@ -317,7 +334,7 @@
 			item = new TableItem (this.table, SWT.NONE);
 			item.setText(milestoneName + " - " + buildName);
 			item.setFont(0, this.boldFont);
-			item.setBackground(this.blueref);
+			if (!onlyMilestones) item.setBackground(this.blueref);
 			italic = this.boldItalicFont;
 		} else {
 			if ((onlyMilestones && Util.getNextMilestone(buildName) != null) ||
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPreferenceInitializer.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPreferenceInitializer.java
index a5e9e29..6c0cf10 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPreferenceInitializer.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/PerformanceResultsPreferenceInitializer.java
@@ -32,11 +32,13 @@
 public void initializeDefaultPreferences() {
 	IEclipsePreferences defaultPreferences = ((IScopeContext) new DefaultScope()).getNode(PLUGIN_ID);
 
-	// Eclipse verison
+	// Eclipse version
 	defaultPreferences.putInt(PRE_ECLIPSE_VERSION, IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
 
-	// Database location
-	defaultPreferences.put(PRE_DATABASE_LOCATION, IPerformancesConstants.DEFAULT_DATABASE_LOCATION);
+	// Database
+	defaultPreferences.putBoolean(PRE_DATABASE_CONNECTION, IPerformancesConstants.DEFAULT_DATABASE_CONNECTION);
+	defaultPreferences.putBoolean(PRE_DATABASE_LOCAL, IPerformancesConstants.DEFAULT_DATABASE_LOCAL);
+	defaultPreferences.put(PRE_DATABASE_LOCATION, IPerformancesConstants.NETWORK_DATABASE_LOCATION);
 
 	// Config descriptors
 	String[][] configDescriptors = PerformanceTestPlugin.getConfigDescriptors();
@@ -59,8 +61,8 @@
 	}
 
 	// Filters
-	defaultPreferences.putBoolean(PRE_FILTER_NON_FINGERPRINT_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_NON_FINGERPRINT_SCENARIOS);
-	defaultPreferences.putBoolean(PRE_FILTER_NON_MILESTONES_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NON_MILESTONES_BUILDS);
+	defaultPreferences.putBoolean(PRE_FILTER_ADVANCED_SCENARIOS, IPerformancesConstants.DEFAULT_FILTER_ADVANCED_SCENARIOS);
+	defaultPreferences.putBoolean(PRE_FILTER_OLD_BUILDS, IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS);
 	defaultPreferences.putBoolean(PRE_FILTER_NIGHTLY_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NIGHTLY_BUILDS);
 
 	// Milestones
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
index 7b653a4..ce6df13 100644
--- 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
@@ -30,11 +30,9 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
 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;
@@ -50,15 +48,40 @@
 public class PerformanceResultsPreferencePage extends PreferencePage
 	implements IWorkbenchPreferencePage, SelectionListener, ModifyListener, IPerformancesConstants {
 
-	private Button maintenanceVersion;
-	private Button developmentVersion;
+	private Button mVersionRadioButton;
+	private Button dVersionRadionButton;
 	private CCombo databaseLocationCombo;
-	private Button localButton;
-	private Button relengButton;
-	private Table configDescriptorsTable;
+	private Button dbConnectionCheckBox;
+	private Button dbLocalBrowseButton;
+	private Button dbRelengRadioButton;
+	private Button dbLocalRadioButton;
 	private CCombo defaultDimensionCombo;
 	private List resultsDimensionsList;
 	private CCombo milestonesCombo;
+	private Label dbLocationLabel;
+	// TODO See whether config descriptors need to be set as preferences or not...
+	// private Table configDescriptorsTable;
+
+/**
+ * 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
@@ -71,7 +94,7 @@
 	CCombo combo= new CCombo(parent, SWT.BORDER);
 	combo.addModifyListener(this);
 	GridData data = new GridData();
-	data.horizontalSpan = 2;
+	data.horizontalSpan = 3;
 	data.horizontalAlignment = GridData.FILL;
 	data.grabExcessHorizontalSpace = true;
 	data.verticalAlignment = GridData.CENTER;
@@ -88,9 +111,10 @@
  *            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) {
+private Composite createComposite(Composite parent, int numColumns, int hSpan) {
 	Composite composite = new Composite(parent, SWT.NULL);
 
 	// GridLayout
@@ -102,6 +126,7 @@
 	GridData data = new GridData();
 	data.verticalAlignment = GridData.FILL;
 	data.horizontalAlignment = GridData.FILL;
+	data.horizontalSpan = hSpan;
 	composite.setLayoutData(data);
 	return composite;
 }
@@ -112,46 +137,51 @@
 protected Control createContents(Composite parent) {
 
 	// Eclipse version choice
-	Composite composite_eclipseVersion = createComposite(parent, 2);
+	Composite composite_eclipseVersion = createComposite(parent, 5, 1);
 	createLabel(composite_eclipseVersion, "Eclipse version", false);
-	Composite composite_versionChoice = createComposite(composite_eclipseVersion, 2);
-	this.maintenanceVersion = createRadioButton(composite_versionChoice, "v"+ECLIPSE_MAINTENANCE_VERSION);
-	this.developmentVersion = createRadioButton(composite_versionChoice, "v"+ECLIPSE_DEVELOPMENT_VERSION);
+	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 compositeDatabaseLocation = createComposite(parent, 5);
-	createLabel(compositeDatabaseLocation, "Database location", false);
-	this.databaseLocationCombo = createCombo(compositeDatabaseLocation);
+	Composite compositeDatabase = createComposite(parent, 5, 1);
+	Group databaseGroup = createGroup(compositeDatabase, "Database");
+	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.localButton = createPushButton(compositeDatabaseLocation, "Local");
-    this.relengButton = createPushButton(compositeDatabaseLocation, "Releng");
+    this.dbLocalBrowseButton = createPushButton(databaseGroup, "Browse");
 
 	// Milestones
-	Composite compositeMilestones = createComposite(parent, 3);
+	Composite compositeMilestones = createComposite(parent, 3, 1);
 	createLabel(compositeMilestones, "Milestones", false);
 	this.milestonesCombo = createCombo(compositeMilestones);
 	this.milestonesCombo.setToolTipText("Enter the date of the milestone as yyyymmddHHMM");
 
-	// Dimension group layout
-	// TODO Put all the dimensions preferences in a group
-	// Currently that does not work, when using the group, none of the controls
-	// defines below are shown in the page???
-//	Composite compositeDimensions = createComposite(parent, 4);
-//	Group dimensionsGroup = createGroup(parent, "Dimensions");
-//	dimensionsGroup.pack();
-
 	// Default dimension layout
-	Composite compositeDefaultDimension = createComposite(parent, 3);
+	StringBuffer tooltip = new StringBuffer("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
-	Composite compositeResultsDimensions = createComposite(parent, 3);
+	tooltip = new StringBuffer("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);
@@ -161,6 +191,7 @@
 	TableColumn secondColumn = new TableColumn(this.configDescriptorsTable, SWT.FILL | SWT.LEFT);
 	secondColumn.setText ("Description");
 	secondColumn.setWidth(300);
+	*/
 
 	// init values
 	initializeValues();
@@ -171,7 +202,7 @@
 	return contents;
 }
 
-/*
+/**
  * Utility method that creates a label instance and sets the default layout
  * data.
  *
@@ -180,19 +211,16 @@
  * @param text
  *            the text for the new label
  * @return the new label
- *
+ */
 private Group createGroup(Composite parent, String text) {
-	Group group = new Group(parent, SWT.LEFT);
+	Group group = new Group(parent, SWT.NONE);
+	group.setLayout(new GridLayout(5, false));
 	group.setText(text);
-	GridData data = new GridData();
-	data.horizontalSpan = 4;
-	data.horizontalAlignment = GridData.FILL;
-	data.verticalSpan = 4;
-	data.verticalAlignment = GridData.FILL;
+	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
@@ -250,7 +278,10 @@
 	button.setText(label);
 	button.addSelectionListener(this);
 	GridData data = new GridData();
-	data.horizontalAlignment = GridData.FILL;
+	data.horizontalAlignment = SWT.LEFT;
+	data.grabExcessHorizontalSpace = true;
+//	data.horizontalSpan = 2;
+	data.minimumWidth = 100;
 	button.setLayoutData(data);
 	return button;
 }
@@ -274,13 +305,13 @@
 	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);
@@ -290,6 +321,7 @@
 	table.setLayoutData(gridData);
 	return table;
 }
+*/
 
 /*
  * Create a text field specific for this application
@@ -320,12 +352,30 @@
 	return UiPlugin.getDefault().getPreferenceStore();
 }
 
+/**
+ * @return
+ */
+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(DB_Results.getDbTitle());
+	dialog.setText(getDialogTitle());
 	dialog.setMessage("Select local database directory:");
 	dialog.setFilterPath(location);
 	String path = dialog.open();
@@ -366,28 +416,30 @@
 private void initializeDefaults() {
 	IPreferenceStore store = getPreferenceStore();
 
-	// Init default database location
-	String location = store.getDefaultString(PRE_DATABASE_LOCATION);
-	this.databaseLocationCombo.setText(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;
-		}
+	// 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.add(location, 0);
+	this.databaseLocationCombo.removeAll();
+	this.databaseLocationCombo.setText(store.getString(PRE_DATABASE_LOCATION));
+	updateDatabaseGroup();
 
 	// Init eclipse version
-	this.maintenanceVersion.setSelection(false);
-	this.developmentVersion.setSelection(false);
+	this.mVersionRadioButton.setSelection(false);
+	this.dVersionRadionButton.setSelection(false);
 	int version = store.getDefaultInt(PRE_ECLIPSE_VERSION);
 	if (version == ECLIPSE_MAINTENANCE_VERSION) {
-		this.maintenanceVersion.setSelection(true);
+		this.mVersionRadioButton.setSelection(true);
 	} else {
-		this.developmentVersion.setSelection(true);
+		this.dVersionRadionButton.setSelection(true);
 	}
+    updateBrowseButtonToolTip(version);
 
 	// Milestones
 	this.milestonesCombo.removeAll();
@@ -413,7 +465,15 @@
 private void initializeValues() {
 	IPreferenceStore store = getPreferenceStore();
 
-	// Init database location
+	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++) {
@@ -422,14 +482,17 @@
 			break;
 		this.databaseLocationCombo.add(history);
 	}
+	updateDatabaseGroup();
+
 
 	// Init eclipse version
 	int version = store.getInt(PRE_ECLIPSE_VERSION);
 	if (version == ECLIPSE_MAINTENANCE_VERSION) {
-		this.maintenanceVersion.setSelection(true);
+		this.mVersionRadioButton.setSelection(true);
 	} else {
-		this.developmentVersion.setSelection(true);
+		this.dVersionRadionButton.setSelection(true);
 	}
+    updateBrowseButtonToolTip(version);
 
 	// Milestones
 	String milestone = store.getString(PRE_MILESTONE_BUILDS + version + "0");
@@ -462,6 +525,7 @@
 	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);
@@ -473,6 +537,7 @@
 		descriptorName = store.getString(PRE_CONFIG_DESCRIPTOR_NAME + "." + d);
 		descriptorDescription = store.getString(PRE_CONFIG_DESCRIPTOR_DESCRIPTION + "." + d++);
 	}
+	*/
 }
 
 /**
@@ -515,32 +580,32 @@
 			String str = milestoneDate.substring(0, 4);
 			int year = Integer.parseInt(str);
 			if (year < 2009 || year > 2020) { // 2020 should be enough!
-				MessageDialog.openError(getShell(), DB_Results.getDbTitle(), milestoneDate+": "+str+" is an invalid year, only value between 2009 and 2020 is accepted!");
+				MessageDialog.openError(getShell(), getDialogTitle(), milestoneDate+": "+str+" is an invalid year, only value between 2009 and 2020 is accepted!");
 				return;
 			}
 			str = milestoneDate.substring(4, 6);
 			int month = Integer.parseInt(str);
 			if (month <= 0 || month > 12) {
-				MessageDialog.openError(getShell(), DB_Results.getDbTitle(), milestoneDate+": "+str+" is an invalid month, it should be only from 01 to 12!");
+				MessageDialog.openError(getShell(), getDialogTitle(), milestoneDate+": "+str+" is an invalid month, it should be only from 01 to 12!");
 				return;
 			}
 			str = milestoneDate.substring(6, 8);
 			int day = Integer.parseInt(str);
 			if (day <= 0 || day > 31) {
 				// TODO improve this verification
-				MessageDialog.openError(getShell(), DB_Results.getDbTitle(), milestoneDate+": "+str+" is an invalid day, it should be only from 01 to 31!");
+				MessageDialog.openError(getShell(), getDialogTitle(), milestoneDate+": "+str+" is an invalid day, it should be only from 01 to 31!");
 				return;
 			}
 			str = milestoneDate.substring(8, 10);
 			int hour = Integer.parseInt(str);
 			if (hour < 0 || hour > 23) {
-				MessageDialog.openError(getShell(), DB_Results.getDbTitle(), milestoneDate+": "+str+" is an invalid hour, it should be only from 00 to 23!");
+				MessageDialog.openError(getShell(), getDialogTitle(), milestoneDate+": "+str+" is an invalid hour, it should be only from 00 to 23!");
 				return;
 			}
 			str = milestoneDate.substring(10, 12);
 			int min = Integer.parseInt(str);
 			if (min < 0 || min > 59) {
-				MessageDialog.openError(getShell(), DB_Results.getDbTitle(), milestoneDate+": "+str+" is invalid minutes, it should be only from 00 to 59!");
+				MessageDialog.openError(getShell(), getDialogTitle(), milestoneDate+": "+str+" is invalid minutes, it should be only from 00 to 59!");
 				return;
 			}
 		}
@@ -586,7 +651,7 @@
 				char digit = lastMilestone.charAt(5);
 				milestoneName = "R3_" + version + "_" + ((char)(digit+1));
 			} else {
-				MessageDialog.openError(getShell(), DB_Results.getDbTitle(), "Unexpected last milestone name: "+lastMilestone+"!");
+				MessageDialog.openError(getShell(), getDialogTitle(), "Unexpected last milestone name: "+lastMilestone+"!");
 				return;
 			}
 
@@ -595,14 +660,14 @@
 			final String lastMilestoneDate = lastMilestone.substring(lastMilestoneDash+1);
 			if (milestoneDate.compareTo(lastMilestoneDate) <= 0) {
 				// TODO improve this verification
-				MessageDialog.openError(getShell(), DB_Results.getDbTitle(), "Milestone "+milestoneDate+" should be after the last milestone: "+lastMilestoneDate+"!");
+				MessageDialog.openError(getShell(), getDialogTitle(), "Milestone "+milestoneDate+" should be after the last milestone: "+lastMilestoneDate+"!");
 				return;
 			}
 		}
 
 		// Verification are ok, ask to add the milestone
 		final String milestone = milestoneName + "-" + milestoneDate;
-		if (MessageDialog.openConfirm(getShell(), DB_Results.getDbTitle(), milestoneDate+" is a valid milestone date.\n\nDo you want to add the milestone '"+milestone+"' to the preferences?")) {
+		if (MessageDialog.openConfirm(getShell(), getDialogTitle(), milestoneDate+" is a valid milestone date.\n\nDo you want to add the milestone '"+milestone+"' to the preferences?")) {
 			this.milestonesCombo.add(milestone);
 			this.milestonesCombo.setText("");
 		}
@@ -614,7 +679,7 @@
  * @param milestone
  */
 void openMilestoneErrorMessage(String milestone) {
-	MessageDialog.openError(getShell(), DB_Results.getDbTitle(), milestone+" is an invalid milestone name. Only 'Mx-yyyymmddHHMM' or 'RCx-yyyymmddHHMM' are accepted!");
+	MessageDialog.openError(getShell(), getDialogTitle(), milestone+" is an invalid milestone name. Only 'Mx-yyyymmddHHMM' or 'RCx-yyyymmddHHMM' are accepted!");
 }
 
 /*
@@ -634,7 +699,7 @@
 		IEclipsePreferences preferences = new InstanceScope().getNode(PLUGIN_ID);
 		preferences.flush();
 		BuildsView buildsView = (BuildsView) PerformancesView.getWorkbenchView("org.eclipse.test.internal.performance.results.ui.BuildsView");
-		buildsView.resetViews();
+		buildsView.resetView();
 	} catch (BackingStoreException e) {
 		e.printStackTrace();
 		return false;
@@ -650,16 +715,23 @@
 
 	// Set version
 	int version;
-	if (this.maintenanceVersion.getSelection()) {
+	if (this.mVersionRadioButton.getSelection()) {
 		version = ECLIPSE_MAINTENANCE_VERSION;
 	} else {
 		version = ECLIPSE_DEVELOPMENT_VERSION;
 	}
 	store.setValue(PRE_ECLIPSE_VERSION, version);
 
-	// Set database location
+	// 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();
-	store.setValue(PRE_DATABASE_LOCATION, location);
+	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);
@@ -668,16 +740,23 @@
 			break;
 		}
 	}
-	this.databaseLocationCombo.add(location, 0);
-	for (int i=0; i<count; i++) {
+	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 milestones
 	count  = this.milestonesCombo.getItemCount();
-	for (int i=0; i<count; i++) {
+	for (i=0; i<count; i++) {
 		store.putValue(PRE_MILESTONE_BUILDS + version + i, this.milestonesCombo.getItem(i));
 	}
 	Util.setMilestones(this.milestonesCombo.getItems());
@@ -692,7 +771,7 @@
 	int length = indices.length;
 	String[] dimensions = new String[length];
 	if (length > 0) {
-		for (int i = 0; i < indices.length; i++) {
+		for (i = 0; i < indices.length; i++) {
 			dimensions[i] = this.resultsDimensionsList.getItem(indices[i]);
 			store.putValue(PRE_RESULTS_DIMENSION + "." + i, dimensions[i]);
 		}
@@ -700,6 +779,7 @@
 	DB_Results.setResultsDimensions(dimensions);
 
 	// Set config descriptors
+	/* TODO See whether config descriptors need to be set as preferences or not...
 	TableItem[] items = this.configDescriptorsTable.getItems();
 	length = items.length;
 	for (int i = 0; i < length; i++) {
@@ -707,6 +787,7 @@
 		store.putValue(PRE_CONFIG_DESCRIPTOR_NAME + "." + i, item.getText(0));
 		store.putValue(PRE_CONFIG_DESCRIPTOR_DESCRIPTION + "." + i, item.getText(1));
 	}
+	*/
 }
 
 /**
@@ -721,36 +802,68 @@
 public void widgetSelected(SelectionEvent event) {
 
 	// As for directory when 'Local' button is pushed
-	if (event.getSource() == this.localButton) {
+	final Object source = event.getSource();
+	if (source == this.dbLocalBrowseButton) {
 		String location = this.databaseLocationCombo.getText();
-		if (location.length() == 0 || location.startsWith("net://")) {
-			location = DEFAULT_LOCAL_DATA_DIR.substring(0, DEFAULT_LOCAL_DATA_DIR.lastIndexOf(File.separatorChar));
+		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()) {
+				StringBuffer message = new StringBuffer("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.startsWith("net://")) {
-					location = item;
+				if (item.equals(path)) {
+					index = i;
 					break;
 				}
 			}
-		}
-		String path = getDirectoryPath(location);
-		if (path != null) {
+			// 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);
-			this.databaseLocationCombo.add(path);
+			updateLocalDb();
 		}
 	}
 
 	// Reset dabase location when 'Releng' button is pushed
-	if (event.getSource() == this.relengButton) {
-		this.databaseLocationCombo.setText(DEFAULT_DATABASE_LOCATION);
+	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 (event.getSource() == this.resultsDimensionsList) {
+	if (source == this.resultsDimensionsList) {
 		String[] resultsDimensions = this.resultsDimensionsList.getSelection();
 		int length = resultsDimensions.length;
 		String defaultDimension = this.defaultDimensionCombo.getText();
@@ -764,5 +877,68 @@
 		resultsDimensions[length] = defaultDimension;
 		this.resultsDimensionsList.setSelection(resultsDimensions);
 	}
+
+	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
index b223100..4298cc0 100644
--- 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
@@ -47,7 +47,6 @@
 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.model.ResultsElement;
 import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IMemento;
@@ -61,6 +60,7 @@
 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;
 
 
 /**
@@ -105,6 +105,15 @@
 			return true;
 		}
 	};
+	final static ViewerFilter FILTER_OLD_BUILDS = new ViewerFilter() {
+		public boolean select(Viewer v, Object parentElement, Object element) {
+			if (element instanceof BuildResultsElement) {
+				BuildResultsElement buildElement = (BuildResultsElement) element;
+				return buildElement.isImportant();
+			}
+	        return true;
+        }
+	};
 	Set viewFilters = new HashSet();
 
 	// SWT resources
@@ -126,6 +135,8 @@
 	Action changeDataDir;
 	Action filterBaselineBuilds;
 	Action filterNightlyBuilds;
+	Action filterOldBuilds;
+//	Action dbConnection;
 
 	// Eclipse preferences
 	IEclipsePreferences preferences;
@@ -161,14 +172,15 @@
 public PerformancesView() {
 	this.preferences = new InstanceScope().getNode(IPerformancesConstants.PLUGIN_ID);
 	int eclipseVersion = this.preferences.getInt(IPerformancesConstants.PRE_ECLIPSE_VERSION, IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
-	String databaseLocation = this.preferences.get(IPerformancesConstants.PRE_DATABASE_LOCATION, IPerformancesConstants.DEFAULT_DATABASE_LOCATION);
-	DB_Results.updateDbConstants(eclipseVersion, databaseLocation);
+	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);
 	setTitleToolTip();
 }
 
 File changeDataDir() {
-	String localDataDir = this.preferences.get(IPerformancesConstants.PRE_LOCAL_DATA_DIR, IPerformancesConstants.DEFAULT_LOCAL_DATA_DIR);
+	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");
@@ -181,31 +193,9 @@
 			refresh = true;
 		}
 		if (refresh) {
-			DB_Results.shutdown();
-			IRunnableWithProgress runnable = new IRunnableWithProgress() {
+			readLocalFiles();
 
-				public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-					try {
-						// String[] components = results.getComponents();
-						// int length = components.length;
-						// if (monitor != null) monitor.beginTask("",
-						// length*1000);
-						monitor.beginTask("Read local files", 1000);
-						PerformancesView.this.results.readLocal(PerformancesView.this.dataDir, 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
-			}
+			// Refresh views
 			refreshInput();
 			PerformancesView resultsView = getSiblingView();
 			resultsView.refreshInput();
@@ -258,22 +248,45 @@
  * Fill the context menu.
  */
 void fillContextMenu(IMenuManager manager) {
-//	manager.add(changeDataDir);
+	// no default contextual action
+}
+
+/*
+ * Fill the filters drop-down menu.
+ */
+void fillFiltersDropDown(IMenuManager manager) {
+	manager.add(this.filterBaselineBuilds);
+	manager.add(this.filterNightlyBuilds);
+}
+
+/*
+ * 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) {
-	manager.add(this.filterBaselineBuilds);
-	manager.add(this.filterNightlyBuilds);
+
+	// 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(IToolBarManager manager) {
-	manager.add(this.changeDataDir);
+	// no default toolbar action
 }
 
 /*
@@ -290,6 +303,19 @@
 }
 
 /*
+ * Filter non milestone builds action run.
+ */
+void filterOldBuilds(boolean filter, boolean updatePreference) {
+	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() {
@@ -353,21 +379,40 @@
 }
 
 /*
+ * 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();
+			}
+		}
+	}
+}
+
+/*
  * Make common actions to performance views.
  */
 void makeActions() {
 
 	// Change data dir action
-	this.changeDataDir = new Action() {
+	this.changeDataDir = new Action("&Read...") {
 		public void run() {
 			changeDataDir();
 		}
 	};
 	this.changeDataDir.setToolTipText("Change the directory of the local data files");
-	this.changeDataDir.setImageDescriptor(ResultsElement.FOLDER_IMAGE_DESCRIPTOR);
+//	this.changeDataDir.setImageDescriptor(ResultsElement.FOLDER_IMAGE_DESCRIPTOR);
 
 	// Filter baselines action
-	this.filterBaselineBuilds = new Action("Filter baselines builds", IAction.AS_CHECK_BOX) {
+	this.filterBaselineBuilds = new Action("&Baselines", IAction.AS_CHECK_BOX) {
 		public void run() {
 			if (isChecked()) {
 				PerformancesView.this.viewFilters.add(FILTER_BASELINE_BUILDS);
@@ -377,15 +422,24 @@
 			updateFilters();
         }
 	};
-	this.filterBaselineBuilds.setToolTipText("Do not show baselines builds in hierarchy");
+	this.filterBaselineBuilds.setToolTipText("Filter baseline builds");
 
 	// Filter baselines action
-	this.filterNightlyBuilds = new Action("Filter nightly builds", IAction.AS_CHECK_BOX) {
+	this.filterNightlyBuilds = new Action("&Nightly", IAction.AS_CHECK_BOX) {
 		public void run() {
 			filterNightlyBuilds(isChecked(), true/*update preference*/);
 		}
 	};
-	this.filterNightlyBuilds.setToolTipText("Do not show nightly builds in hierarchy");
+	this.filterNightlyBuilds.setToolTipText("Filter nightly builds");
+
+	// Filter non-important builds action
+	this.filterOldBuilds = new Action("&Old Builds", IAction.AS_CHECK_BOX) {
+		public void run() {
+			filterOldBuilds(isChecked(), true/*update preference*/);
+		}
+	};
+	this.filterOldBuilds.setChecked(false);
+	this.filterOldBuilds.setToolTipText("Filter old builds (i.e. before last milestone) but keep all previous milestones)");
 }
 
 /* (non-Javadoc)
@@ -393,21 +447,61 @@
  */
 public void preferenceChange(PreferenceChangeEvent event) {
 	String propertyName = event.getKey();
-	String newValue = (String) event.getNewValue();
+//	String newValue = (String) event.getNewValue();
 
 	// Eclipse version change
 	if (propertyName.equals(IPerformancesConstants.PRE_ECLIPSE_VERSION)) {
-		int eclipseVersion = newValue == null ? IPerformancesConstants.DEFAULT_ECLIPSE_VERSION : Integer.parseInt(newValue);
-		String databaseLocation = this.preferences.get(IPerformancesConstants.PRE_DATABASE_LOCATION, IPerformancesConstants.DEFAULT_DATABASE_LOCATION);
-		DB_Results.updateDbConstants(eclipseVersion, databaseLocation);
-		setTitleToolTip();
+//		int eclipseVersion = newValue == null ? IPerformancesConstants.DEFAULT_ECLIPSE_VERSION : Integer.parseInt(newValue);
+//		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);
+//		setTitleToolTip();
 	}
 
 	// Database location change
 	if (propertyName.equals(IPerformancesConstants.PRE_DATABASE_LOCATION)) {
-		int eclipseVersion = this.preferences.getInt(IPerformancesConstants.PRE_ECLIPSE_VERSION, IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
-		DB_Results.updateDbConstants(eclipseVersion, newValue);
-		setTitleToolTip();
+//		boolean connected = this.preferences.getBoolean(IPerformancesConstants.PRE_DATABASE_CONNECTION, IPerformancesConstants.DEFAULT_DATABASE_CONNECTION);
+//		int eclipseVersion = this.preferences.getInt(IPerformancesConstants.PRE_ECLIPSE_VERSION, IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
+//		DB_Results.updateDbConstants(connected, eclipseVersion, newValue);
+//		setTitleToolTip();
+	}
+
+	// Database connection
+	if (propertyName.equals(IPerformancesConstants.PRE_DATABASE_CONNECTION)) {
+//		boolean connected = newValue == null ? IPerformancesConstants.DEFAULT_DATABASE_CONNECTION : newValue.equals(Boolean.TRUE);
+//		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);
+//		DB_Results.updateDbConstants(connected, eclipseVersion, databaseLocation);
+//		setTitleToolTip();
+	}
+}
+
+/*
+ * Read local files
+ */
+void readLocalFiles() {
+
+	// Create runnable to read local files
+	IRunnableWithProgress runnable = new IRunnableWithProgress() {
+		public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+			try {
+				monitor.beginTask("Read local files", 1000);
+				PerformancesView.this.results.readLocal(PerformancesView.this.dataDir, monitor);
+				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
 	}
 }
 
@@ -423,7 +517,7 @@
  * Clear view content.
  */
 void resetInput() {
-	this.results.reset();
+	this.results.reset(null);
 	this.viewer.setInput(getViewSite());
 	this.viewer.refresh();
 }
@@ -449,11 +543,23 @@
 	if (checked) {
 		this.viewFilters.add(FILTER_NIGHTLY_BUILDS);
 	}
+
+	// Filter non important builds action state
+	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);
+	}
 }
 
 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
+	}
 }
 
 /*
@@ -476,11 +582,44 @@
 /*
  * Set the view tooltip to reflect the DB connection kind.
  */
-private void setTitleToolTip() {
-	setTitleToolTip(DB_Results.getDbTitle());
+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() {
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/utils/IPerformancesConstants.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/utils/IPerformancesConstants.java
index ddbbabb..4747b09 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/utils/IPerformancesConstants.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/utils/IPerformancesConstants.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 package org.eclipse.test.internal.performance.results.utils;
 
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-
 /**
  * Interface to define all constants used for performances.
  */
@@ -27,6 +24,8 @@
 
 	    // Preference constants
     public static final String PRE_ECLIPSE_VERSION = PREFIX + "eclipse.version"; //$NON-NLS-1$
+    public static final String PRE_DATABASE_CONNECTION = PREFIX + "database.connection"; //$NON-NLS-1$
+    public static final String PRE_DATABASE_LOCAL = PREFIX + "local"; //$NON-NLS-1$
     public static final String PRE_DATABASE_LOCATION = PREFIX + "database.location"; //$NON-NLS-1$
     public static final String PRE_LOCAL_DATA_DIR = PREFIX + "local.data.dir"; //$NON-NLS-1$
     public static final String PRE_RESULTS_GENERATION_DIR = PREFIX + "results.generation.dir"; //$NON-NLS-1$
@@ -36,8 +35,8 @@
     public static final String PRE_RESULTS_DIMENSION = PREFIX + "results.dimension"; //$NON-NLS-1$
     public static final String PRE_MILESTONE_BUILDS = PREFIX + "milestone.builds"; //$NON-NLS-1$
     public static final String PRE_STATUS_COMMENT_PREFIX = PREFIX + "status.comment"; //$NON-NLS-1$
-    public static final String PRE_FILTER_NON_FINGERPRINT_SCENARIOS = PREFIX + "filter.non.fingerprints.scenarios"; //$NON-NLS-1$
-    public static final String PRE_FILTER_NON_MILESTONES_BUILDS = PREFIX + "filter.non.milestones.builds"; //$NON-NLS-1$
+    public static final String PRE_FILTER_ADVANCED_SCENARIOS = PREFIX + "filter.non.fingerprints.scenarios"; //$NON-NLS-1$
+    public static final String PRE_FILTER_OLD_BUILDS = PREFIX + "filter.non.milestones.builds"; //$NON-NLS-1$
     public static final String PRE_FILTER_NIGHTLY_BUILDS = PREFIX + "filter.nightly.builds"; //$NON-NLS-1$
 
 	// Other constants
@@ -46,18 +45,18 @@
 
 	// Default values
 	public static final String DATABASE_NAME_PREFIX = "perfDb";
-	public static final String DEFAULT_LOCAL_DATA_DIR = new Path(Platform.getOS().equals(Platform.OS_WIN32) ? "C:\\temp" : "/tmp").toOSString();
-	public static final String DEFAULT_DATABASE_LOCATION = "net://trelenggtk.ottawa.ibm.com:1528";
+	public static final String NETWORK_DATABASE_LOCATION = "net://trelenggtk.ottawa.ibm.com:1528";
 	public static final int DEFAULT_ECLIPSE_VERSION = ECLIPSE_DEVELOPMENT_VERSION;
-	public static final String DEFAULT_RESULTS_GENERATION_DIR = new Path(Platform.getOS().equals(Platform.OS_WIN32) ? "C:\\temp" : "/tmp").toOSString();
-	public static final boolean DEFAULT_FILTER_NON_FINGERPRINT_SCENARIOS = true;
-	public static final boolean DEFAULT_FILTER_NON_MILESTONES_BUILDS = false;
+	public static final boolean DEFAULT_FILTER_ADVANCED_SCENARIOS = true;
+	public static final boolean DEFAULT_FILTER_OLD_BUILDS = false;
 	public static final boolean DEFAULT_FILTER_NIGHTLY_BUILDS = false;
-	public static final boolean DEFAULT_AUTOMATIC_CONNECTION = false;
+	public static final boolean DEFAULT_DATABASE_CONNECTION = false;
+	public static final boolean DEFAULT_DATABASE_LOCAL = false;
 
 	// Default milestones nowadays
 	public static final String[] V36_MILESTONES = new String[] {
 		"M1-200908060100",
+		"M2-200909170100",
 	};
 	public static final String[] V35_MILESTONES = new String[] {
 		        "M1-200808071402",
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/utils/Util.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/utils/Util.java
index a6c3d6f..55083c9 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/utils/Util.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/utils/Util.java
@@ -21,6 +21,7 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.StringTokenizer;
@@ -34,6 +35,15 @@
  */
 public final class Util implements IPerformancesConstants {
 private static String[] MILESTONES;
+public static final BuildDateComparator BUILD_DATE_COMPARATOR = new BuildDateComparator();
+
+static class BuildDateComparator implements Comparator {
+	public int compare(Object o1, Object o2) {
+		String s1 = (String) o1;
+		String s2 = (String) o2;
+		return getBuildDate(s1).compareTo(getBuildDate(s2));
+	}
+}
 
 private static void initMilestones() {
 	String version = DB_Results.getDbVersion();
@@ -132,6 +142,35 @@
 }
 
 /**
+ * Copy a file content to another location.
+ *
+ * @param in the input stream.
+ * @param dest the destination.
+ * @return <code>true</code> if the file was successfully copied,
+ * 	<code>false</code> otherwise.
+ */
+public static boolean copyStream(InputStream in, File dest) {
+
+	try {
+		OutputStream out = new FileOutputStream(dest);
+		byte[] buf = new byte[1024];
+		int len;
+		while ((len = in.read(buf)) > 0) {
+			out.write(buf, 0, len);
+		}
+		in.close();
+		out.close();
+	} catch (FileNotFoundException e) {
+		e.printStackTrace();
+		return false;
+	} catch (IOException e) {
+		e.printStackTrace();
+		return false;
+	}
+	return true;
+}
+
+/**
  * Return the build date as yyyyMMddHHmm.
  *
  * @param buildName The build name (e.g. I20090806-0100)
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/FingerPrint.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/FingerPrint.java
index 52e9321..c9002a3 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/FingerPrint.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/FingerPrint.java
@@ -91,10 +91,10 @@
 	this.stream.print("  </form>\n");
 	this.stream.print("</td>\n");
 //	this.stream.print("<td valign=\"top\">\n");
-//	this.stream.print("<a href=\"help.html\"><img hspace=\"10\" border=\"0\" src=\"light.gif\" title=\"Some tips on fingerprints\"/></a>\n");
+//	this.stream.print("<a href=\"help.html\"><img hspace=\"10\" border=\"0\" src=\""+Utils.LIGHT+"\" title=\"Some tips on fingerprints\"/></a>\n");
 //	this.stream.print("</td></tr></table>\n");
 	this.stream.print("</tr></table>\n");
-	this.stream.print("<img hspace=\"10\" border=\"0\" src=\"light.gif\"><a href=\"help.html\">Help on fingerprints</a>\n");
+	this.stream.print("<img hspace=\"10\" border=\"0\" src=\""+Utils.LIGHT+"\"><a href=\""+Utils.HELP+"\">Help on fingerprints</a>\n");
 
 	// Print script to reset dropdown list selection
 	this.stream.print("<script type=\"text/javascript\">\n");
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/GenerateResults.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/GenerateResults.java
index 8c6ea9e..76909dc 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/GenerateResults.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/GenerateResults.java
@@ -12,11 +12,9 @@
 
 import java.io.BufferedOutputStream;
 import java.io.File;
-import java.io.FileFilter;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.PrintStream;
-import java.net.URL;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -24,7 +22,6 @@
 import java.util.List;
 import java.util.StringTokenizer;
 
-import org.eclipse.core.runtime.FileLocator;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.OperationCanceledException;
@@ -525,9 +522,9 @@
 	} else {
 		stream.print(Utils.HTML_OPEN);
 	}
-	stream.print("<link href=\"ToolTip.css\" rel=\"stylesheet\" type=\"text/css\">\n");
-	stream.print("<script src=\"ToolTip.js\"></script>\n");
-	stream.print("<script src=\"Fingerprints.js\"></script>\n");
+	stream.print("<link href=\""+Utils.TOOLTIP_STYLE+"\" rel=\"stylesheet\" type=\"text/css\">\n");
+	stream.print("<script src=\""+Utils.TOOLTIP_SCRIPT+"\"></script>\n");
+	stream.print("<script src=\""+Utils.FINGERPRINT_SCRIPT+"\"></script>\n");
 	stream.print(Utils.HTML_DEFAULT_CSS);
 
 	// Print title
@@ -626,25 +623,32 @@
 	try {
 		stream = new PrintStream(new BufferedOutputStream(new FileOutputStream(outputFile)));
 		printSummaryPresentation(stream);
-		List scenarioNames = DB_Results.getScenarios();
-		int size = scenarioNames.size();
+//		List scenarioNames = DB_Results.getScenarios();
+//		int size = scenarioNames.size();
+		String[] components = this.performanceResults.getComponents();
+		int componentsLength = components.length;
 		printSummaryColumnsTitle(stream/*, performanceResults*/);
 		String[] configs = this.performanceResults.getConfigNames(true/*sorted*/);
 		int configsLength = configs.length;
-		for (int i=0; i<size; i++) {
-			String scenarioName = (String) scenarioNames.get(i);
-			if (scenarioName == null) continue;
-			ScenarioResults scenarioResults = this.performanceResults.getScenarioResults(scenarioName);
-			if (scenarioResults != null) {
-				stream.print("<tr>\n");
-				for (int j=0; j<2; j++) {
-					for (int c=0; c<configsLength; c++) {
-						printSummaryScenarioLine(j, configs[c], scenarioResults, stream);
+		for (int i=0; i<componentsLength; i++) {
+			String componentName = components[i];
+			List scenarioNames = this.performanceResults.getComponentScenarios(componentName);
+			int size = scenarioNames.size();
+			for (int s=0; s<size; s++) {
+				String scenarioName = ((ScenarioResults) scenarioNames.get(s)).getName();
+				if (scenarioName == null) continue;
+				ScenarioResults scenarioResults = this.performanceResults.getScenarioResults(scenarioName);
+				if (scenarioResults != null) {
+					stream.print("<tr>\n");
+					for (int j=0; j<2; j++) {
+						for (int c=0; c<configsLength; c++) {
+							printSummaryScenarioLine(j, configs[c], scenarioResults, stream);
+						}
 					}
+					stream.print("<td>");
+					stream.print(scenarioName);
+					stream.print("</td></tr>\n");
 				}
-				stream.print("<td>");
-				stream.print(scenarioName);
-				stream.print("</td></tr>\n");
 			}
 		}
 	} catch (Exception e) {
@@ -846,16 +850,33 @@
 
 		// Copy images and scripts to output dir
 		Bundle bundle = UiPlugin.getDefault().getBundle();
-		URL images = bundle.getEntry("images");
-		if (images != null) {
-			images = FileLocator.resolve(images);
-			Utils.copyImages(new File(images.getPath()), this.outputDir);
+//		URL images = bundle.getEntry("images");
+//		if (images != null) {
+//			images = FileLocator.resolve(images);
+//			Utils.copyImages(new File(images.getPath()), this.outputDir);
+//		}
+		/* New way to get images
+		File content = FileLocator.getBundleFile(bundle);
+		BundleFile bundleFile;
+		if (content.isDirectory()) {
+			bundleFile = new DirBundleFile(content);
+			Utils.copyImages(bundleFile.getFile("images", true), this.outputDir);
+		} else {
+			bundleFile = new ZipBundleFile(content, null);
+			Enumeration imageFiles = bundle.findEntries("images", "*.gif", false);
+			while (imageFiles.hasMoreElements()) {
+				URL url = (URL) imageFiles.nextElement();
+				Utils.copyFile(bundleFile.getFile("images"+File.separator+, true), this.outputDir);
+			}
 		}
-		URL scripts = bundle.getEntry("scripts");
-		if (scripts != null) {
-			scripts = FileLocator.resolve(scripts);
-			Utils.copyScripts(new File(scripts.getPath()), this.outputDir);
-		}
+		*/
+		// Copy bundle files
+		Utils.copyBundleFiles(bundle, "images", "*.gif", this.outputDir); // images
+		Utils.copyBundleFiles(bundle, "scripts", "*.js", this.outputDir); // java scripts
+		Utils.copyBundleFiles(bundle, "scripts", "*.css", this.outputDir); // styles
+		Utils.copyBundleFiles(bundle, "doc", "*.html", this.outputDir); // doc
+		Utils.copyBundleFiles(bundle, "doc/images", "*.png", this.outputDir); // images for doc
+		/*
 		URL doc = bundle.getEntry("doc");
 		if (doc != null) {
 			doc = FileLocator.resolve(doc);
@@ -884,6 +905,7 @@
 				}
 			}
 		}
+		*/
 
 		// Print HTML pages and all linked files
 		if (this.printStream != null) {
@@ -970,14 +992,13 @@
 	}
 
 	// Verify that build is known
-	String[] builds = DB_Results.getBuilds();
+	String[] builds = this.performanceResults.getAllBuildNames();
 	if (builds == null || builds.length == 0) {
 		System.err.println("Cannot connect to database to generate results build '"+buildName+"'");
 		System.exit(1);
 	}
-	if (Arrays.binarySearch(builds, buildName) < 0) {
-		System.err.println("No results in database for build '"+buildName+"'");
-		System.exit(1);
+	if (Arrays.binarySearch(builds, buildName, Util.BUILD_DATE_COMPARATOR) < 0) {
+		throw new RuntimeException("No results in database for build '"+buildName+"'");
 	}
 	if (this.printStream != null) {
 		this.printStream.println();
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/Main.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/Main.java
index fa904ee..dfe3312 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/Main.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/Main.java
@@ -12,6 +12,7 @@
 
 import org.eclipse.equinox.app.IApplication;
 import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.test.internal.performance.results.db.DB_Results;
 
 /**
  * Main class to generate performance results of all scenarios matching a given pattern
@@ -33,7 +34,7 @@
  * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
  */
 public Object start(IApplicationContext context) throws Exception {
-
+	DB_Results.DB_CONNECTION = true; // force DB connection while running the application
 	GenerateResults generation = new GenerateResults();
 	String[] args = (String[]) context.getArguments().get("application.args");
 	generation.run(args);
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/UiPlugin.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/UiPlugin.java
index d7d2b28..58462dd 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/UiPlugin.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/UiPlugin.java
@@ -10,15 +10,19 @@
  *******************************************************************************/
 package org.eclipse.test.performance.ui;
 
-import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
 import org.osgi.framework.BundleContext;
 
 /**
  * The main plugin class to be used in the desktop.
  */
-public class UiPlugin extends AbstractUIPlugin {
+public class UiPlugin extends Plugin {
 	//The shared instance.
 	private static UiPlugin plugin;
+	private IPreferenceStore preferenceStore;
 
 	/**
 	 * The constructor.
@@ -52,4 +56,12 @@
 		return plugin;
 	}
 
+	public IPreferenceStore getPreferenceStore() {
+		if (this.preferenceStore == null) {
+			this.preferenceStore = new ScopedPreferenceStore(new InstanceScope(), getBundle().getSymbolicName());
+
+		}
+		return this.preferenceStore;
+	}
+
 }
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/Utils.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/Utils.java
index 0dbf450..b4feffd 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/Utils.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/Utils.java
@@ -16,10 +16,12 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.net.URL;
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.util.Arrays;
 import java.util.Calendar;
+import java.util.Enumeration;
 import java.util.HashMap;
 
 import org.eclipse.swt.SWT;
@@ -31,6 +33,7 @@
 import org.eclipse.test.internal.performance.PerformanceTestPlugin;
 import org.eclipse.test.internal.performance.db.Variations;
 import org.eclipse.test.internal.performance.results.utils.Util;
+import org.osgi.framework.Bundle;
 
 
 public class Utils {
@@ -54,14 +57,26 @@
 		STDERR_FORMAT.setMultiplier(100);
 	}
 	public final static String STANDARD_ERROR_THRESHOLD_STRING = PERCENT_FORMAT.format(STANDARD_ERROR_THRESHOLD);
-	public final static String UNKNOWN_IMAGE="Unknown.gif";
-	public final static String OK_IMAGE="OK.gif";
-	public final static String OK_IMAGE_WARN="OK_caution.gif";
-	public final static String FAIL_IMAGE="FAIL.gif";
-	public final static String FAIL_IMAGE_WARN="FAIL_caution.gif";
-	public final static String FAIL_IMAGE_EXPLAINED="FAIL_greyed.gif";
-	public final static String LIGHT="light.gif";
-	public final static String WARNING_OBJ="warning_obj.gif";
+
+	// Image files
+	public final static String UNKNOWN_IMAGE="images/Unknown.gif";
+	public final static String OK_IMAGE="images/OK.gif";
+	public final static String OK_IMAGE_WARN="images/OK_caution.gif";
+	public final static String FAIL_IMAGE="images/FAIL.gif";
+	public final static String FAIL_IMAGE_WARN="images/FAIL_caution.gif";
+	public final static String FAIL_IMAGE_EXPLAINED="images/FAIL_greyed.gif";
+	public final static String LIGHT="images/light.gif";
+	public final static String WARNING_OBJ="images/warning_obj.gif";
+
+	// Java script files
+	public final static String TOOLTIP_SCRIPT = "scripts/ToolTip.js";
+	public final static String TOOLTIP_STYLE = "scripts/ToolTip.css";
+	public final static String FINGERPRINT_SCRIPT = "scripts/Fingerprints.js";
+
+	// Doc files
+	public final static String HELP = "doc/help.html";
+
+	// Status
 	public final static int OK = 0;
 	public final static int NAN = 0x1;
 	public final static int ERR = 0x2;
@@ -106,41 +121,21 @@
 	}
 
 	/**
-	 * Copy all image files.
+	 * Copy all bundle files contained in the given path
 	 */
-	public static void copyImages(File images, File output) {
-		Util.copyFile(new File(images, FAIL_IMAGE), new File(output, FAIL_IMAGE));
-		Util.copyFile(new File(images, FAIL_IMAGE_EXPLAINED), new File(output, FAIL_IMAGE_EXPLAINED));
-		Util.copyFile(new File(images, FAIL_IMAGE_WARN), new File(output, FAIL_IMAGE_WARN));
-		Util.copyFile(new File(images, OK_IMAGE), new File(output, OK_IMAGE));
-		Util.copyFile(new File(images, OK_IMAGE_WARN), new File(output, OK_IMAGE_WARN));
-		Util.copyFile(new File(images, UNKNOWN_IMAGE), new File(output, UNKNOWN_IMAGE));
-		Util.copyFile(new File(images, LIGHT), new File(output, LIGHT));
-		Util.copyFile(new File(images, WARNING_OBJ), new File(output, WARNING_OBJ));
-	}
-
-	/**
-	 * Copy all scripts files.
-	 */
-	public static void copyScripts(File scripts, File output) {
-		Util.copyFile(new File(scripts, "ToolTip.css"), new File(output, "ToolTip.css"));
-		Util.copyFile(new File(scripts, "ToolTip.js"), new File(output, "ToolTip.js"));
-		Util.copyFile(new File(scripts, "Fingerprints.js"), new File(output, "Fingerprints.js"));
-	}
-
-	/**
-	 * Copy all doc files.
-	 */
-	public static void copyDoc(File docDir, File output) {
-		File[] docFiles = docDir.listFiles();
-		for (int i=0; i<docFiles.length; i++) {
-			File file = docFiles[i];
-			if (file.isDirectory()) {
-				File subdir = new File(output, file.getName());
-				subdir.mkdir();
-				copyDoc(file, subdir);
-			} else {
-				Util.copyFile(file, new File(output, file.getName()));
+	public static void copyBundleFiles(Bundle bundle, String path, String pattern, File output) {
+		Enumeration imageFiles = bundle.findEntries(path, pattern, false);
+		while (imageFiles.hasMoreElements()) {
+			URL url = (URL) imageFiles.nextElement();
+			try {
+				File outputFile = new File(output, url.getFile());
+				if (!outputFile.getParentFile().exists()) {
+					outputFile.getParentFile().mkdirs();
+				}
+				Util.copyStream(url.openStream(), outputFile);
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
 			}
 		}
 	}
@@ -417,4 +412,5 @@
 		}
 	}
 }
+
 }
\ 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
new file mode 100644
index 0000000..864ff8a
--- /dev/null
+++ b/bundles/org.eclipse.test.performance.ui/toc.xml
@@ -0,0 +1,16 @@
+<?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>
+	<topic label="Verification" href="html/verification.html"/> 
+</toc>