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>
