diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ConfigResults.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ConfigResults.java
index dcebb0d..14a0653 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ConfigResults.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ConfigResults.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -135,8 +135,8 @@
  * @return The list of the builds which names match the given pattern.
  * 	The list is ordered by build results date.
  */
-public List getBuilds(String buildPattern) {
-	List builds = new ArrayList();
+public List<BuildResults> getBuilds(String buildPattern) {
+	List<BuildResults> builds = new ArrayList<>();
 	int size = size();
 	for (int i=0; i<size; i++) {
 		BuildResults buildResults = (BuildResults) this.children.get(i);
@@ -172,15 +172,15 @@
  * @param prefixes List of expected prefixes
  * @return A list of builds which names start with one of the given patterns.
  */
-public List getBuildsMatchingPrefixes(List prefixes) {
-	List builds = new ArrayList();
+public List<AbstractResults> getBuildsMatchingPrefixes(List<String> prefixes) {
+	List<AbstractResults> builds = new ArrayList<>();
 	int size = size();
 	int length = prefixes.size();
 	for (int i=0; i<size; i++) {
 		AbstractResults buildResults = (AbstractResults) this.children.get(i);
 		String buildName = buildResults.getName();
 		for (int j=0; j<length; j++) {
-			if (buildName.startsWith((String)prefixes.get(j))) {
+			if (buildName.startsWith(prefixes.get(j))) {
 				builds.add(buildResults);
 			}
 		}
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 3fe2ec5..ffa6173 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
@@ -50,7 +50,7 @@
 public class PerformanceResults extends AbstractResults {
 
 	String[] allBuildNames = null;
-	Map allScenarios;
+	Map<String, List<ScenarioResults>> allScenarios;
 	String lastBuildName; // Name of the last used build
 	String baselineName; // Name of the baseline build used for comparison
 	private String scenarioPattern = "%"; //$NON-NLS-1$
@@ -395,7 +395,7 @@
 	RemainingTimeGuess timeGuess = null;
 	for (int i=0; i<componentsLength; i++) {
 		String componentName = this.components[i];
-		List scenarios = this.allScenarios == null ? null : (List) this.allScenarios.get(componentName);
+		List<ScenarioResults> scenarios = this.allScenarios == null ? null : this.allScenarios.get(componentName);
 
 		// Manage monitor
 		int percentage = (int) ((((double)(i+1)) / (componentsLength+1)) * 100);
@@ -547,10 +547,9 @@
 	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)));
+
+	// Read local file info
+	try (DataInputStream stream = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));){
 
 		// Read build info
 		String str = stream.readUTF();
@@ -602,7 +601,7 @@
 		for (int i = 0; i < length; i++) {
 			this.components[i] = stream.readUTF();
 			int size = stream.readInt();
-			List scenarios = new ArrayList(size);
+			List<ScenarioResults> scenarios = new ArrayList<>(size);
 			for (int j=0; j<size; j++) {
 				scenarios.add(new ScenarioResults(stream.readInt(), stream.readUTF(), stream.readUTF()));
 			}
@@ -611,14 +610,6 @@
 		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 {
-		    if (stream != null) {
-	        stream.close();
-		    }
-        } catch (IOException e) {
-	        // nothing else to do!
-        }
 	}
 }
 
@@ -642,7 +633,7 @@
 	componentsSet.toArray(this.components = new String[componentsSize]);
 	for (int i=0; i<componentsSize; i++) {
 		String componentName = this.components[i];
-		List scenarios = (List) this.allScenarios.get(componentName);
+		List scenarios = this.allScenarios.get(componentName);
 		allScenariosSize += scenarios.size();
 	}
 	println(" -> "+allScenariosSize+" found in "+(System.currentTimeMillis()-start)+"ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
@@ -661,7 +652,7 @@
 }
 
 private void setAllBuildNames() {
-	SortedSet builds = new TreeSet(Util.BUILD_DATE_COMPARATOR);
+	SortedSet<String> builds = new TreeSet<>(Util.BUILD_DATE_COMPARATOR);
 	int size = size();
 	if (size == 0) return;
 	for (int i=0; i<size; i++) {
@@ -673,9 +664,9 @@
 	this.allBuildNames = new String[buildsSize];
 	if (buildsSize > 0) {
 		int n = 0;
-		Iterator buildNames = builds.iterator();
+		Iterator<String> buildNames = builds.iterator();
 		while (buildNames.hasNext()) {
-			String buildName = (String) buildNames.next();
+			String buildName = buildNames.next();
 			if (this.lastBuildName == null || Util.getBuildDate(buildName).compareTo(Util.getBuildDate(this.lastBuildName)) <= 0) {
 				this.allBuildNames[n++] = buildName;
 			}
@@ -955,8 +946,7 @@
 		}
 		dataFile.delete();
 	}
-	try {
-		DataOutputStream stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
+	try (DataOutputStream stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)))){
 
 		// Write build info
 		stream.writeUTF(this.name == null ? DB_Results.getLastCurrentBuild() : this.name);
@@ -984,19 +974,17 @@
 		stream.writeInt(length);
 		for (int i = 0; i < length; i++) {
 			stream.writeUTF(this.components[i]);
-			List scenarios = (List) this.allScenarios.get(this.components[i]);
+			List<ScenarioResults> scenarios = 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);
+				final 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$
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ScenarioResults.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ScenarioResults.java
index 1bc51d4..e0e6b37 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ScenarioResults.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/db/ScenarioResults.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -96,15 +96,15 @@
 	return buffer.toString();
 }
 
-Set getAllBuildNames() {
-	Set buildNames = new HashSet();
+Set<String> getAllBuildNames() {
+	Set<String> buildNames = new HashSet<>();
 	int size = size();
 	for (int i=0; i<size; i++) {
 		ConfigResults configResults = (ConfigResults) this.children.get(i);
-		List builds = configResults.getBuilds(null);
+		List<BuildResults> builds = configResults.getBuilds(null);
 		int length = builds.size();
 		for (int j=0; j<length; j++) {
-			buildNames.add(((BuildResults)builds.get(j)).getName());
+			buildNames.add(builds.get(j).getName());
 		}
 	}
 	return buildNames;
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 056eb63..58f77ee 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
@@ -58,9 +58,9 @@
 	private static final PropertyDescriptor BUILD_TEST_ERROR_DESCRIPTOR = new PropertyDescriptor(P_ID_BUILD_ERROR, P_STR_BUILD_ERROR);
 	private static final PropertyDescriptor BUILD_STUDENTS_TTEST_DESCRIPTOR = new PropertyDescriptor(P_ID_BUILD_TTEST, P_STR_BUILD_TTEST);
 
-    private static Vector DESCRIPTORS;
+    private static Vector<PropertyDescriptor> DESCRIPTORS;
     static Vector initDescriptors(int status) {
-		DESCRIPTORS = new Vector();
+		DESCRIPTORS = new Vector<>();
 		// Status category
 		DESCRIPTORS.add(getInfosDescriptor(status));
 		DESCRIPTORS.add(getWarningsDescriptor(status));
@@ -91,7 +91,7 @@
         return DESCRIPTORS;
 	}
     static ComboBoxPropertyDescriptor getInfosDescriptor(int status) {
-		List list = new ArrayList();
+		List<String> list = new ArrayList<>();
 		if ((status & SMALL_VALUE) != 0) {
 			list.add("This test and/or its variation has a small value, hence it may not be necessary to spend time on fixing it if a regression occurs");
 		}
@@ -107,7 +107,7 @@
 		return infoDescriptor;
 	}
     static PropertyDescriptor getWarningsDescriptor(int status) {
-		List list = new ArrayList();
+		List<String> list = new ArrayList<>();
 		if ((status & BIG_ERROR) != 0) {
 			list.add("The error on this test is over the 3% threshold, hence its result may not be really reliable");
 		}
@@ -191,7 +191,7 @@
 
 @Override
 public IPropertyDescriptor[] getPropertyDescriptors() {
-	Vector descriptors = getDescriptors();
+	Vector<PropertyDescriptor> descriptors = getDescriptors();
 	if (descriptors == null) {
 		descriptors = initDescriptors(getStatus());
 	}
@@ -200,7 +200,7 @@
 	descriptorsArray[0] = getInfosDescriptor(getStatus());
 	descriptorsArray[1] = getWarningsDescriptor(getStatus());
 	for (int i=2; i<size; i++) {
-		descriptorsArray[i] = (IPropertyDescriptor) descriptors.get(i);
+		descriptorsArray[i] = descriptors.get(i);
 	}
 	return descriptorsArray;
 }
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ComponentResultsElement.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ComponentResultsElement.java
index 3beee24..0277cf7 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ComponentResultsElement.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/model/ComponentResultsElement.java
@@ -154,9 +154,9 @@
 	}
 	List scenarios = new ArrayList();
 	if (this.results != null) {
-		Iterator iterator = this.results.getResults();
+		Iterator<ScenarioResults> iterator = this.results.getResults();
 		while (iterator.hasNext()) {
-			ScenarioResults scenarioResults = (ScenarioResults) iterator.next();
+			ScenarioResults scenarioResults = iterator.next();
 			if (scenarioResults.hasSummary()) {
 				scenarios.add(scenarioResults);
 			}
@@ -171,8 +171,8 @@
  * @param fingerprint Tell whether only fingerprint scenarios are expected or not.
  * @return A list of {@link String}.
  */
-public List getScenariosLabels(boolean fingerprint) {
-	List labels = new ArrayList();
+public List<String> getScenariosLabels(boolean fingerprint) {
+	List<String> labels = new ArrayList<>();
 	if (this.results != null) {
 		AbstractResults[] scenarios = this.results.getChildren();
 		int length = scenarios.length;
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 3ce2dd1..064f67c 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
@@ -535,7 +535,7 @@
 	if (this.results == null) {
 		return new String[0];
 	}
-	List labels = this.results.getScenariosLabels(fingerprints);
+	List<String> labels = this.results.getScenariosLabels(fingerprints);
 	labels.add(0, "Build");
 	String[] names = new String[labels.size()];
 	labels.toArray(names);
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 8a02a55..ff0e826 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
@@ -473,10 +473,10 @@
  */
 void initDimensionsLists() {
 	// Dimensions lists
-	java.util.List dimensions = PerformanceTestPlugin.getDimensions();
-	Iterator names = dimensions.iterator();
+	java.util.List<String> dimensions = PerformanceTestPlugin.getDimensions();
+	Iterator<String> names = dimensions.iterator();
 	while (names.hasNext()) {
-		String name = (String) names.next();
+		String name = names.next();
 		this.defaultDimensionCombo.add(name);
 		this.resultsDimensionsList.add(name);
 	}
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 db39711..f3914e3 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
@@ -118,7 +118,7 @@
 	        return true;
         }
 	};
-	Set viewFilters = new HashSet();
+	Set<ViewerFilter> viewFilters = new HashSet<>();
 
 	// SWT resources
 	Shell shell;
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/BarGraph.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/BarGraph.java
index 438909c..a93d0fd 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/BarGraph.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/BarGraph.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -55,11 +55,11 @@
 	}
 
 	private String fTitle;
-	private List fItems;
+	private List<BarItem> fItems;
 
 	BarGraph(String title) {
 		this.fTitle= title;
-		this.fItems= new ArrayList();
+		this.fItems= new ArrayList<>();
 	}
 
 	public void addItem(String name, double[] stats, String url, String slow, boolean significant) {
@@ -79,7 +79,7 @@
 
 		NumberFormat nf= NumberFormat.getInstance();
 
-		BarItem[] bars= (BarItem[]) this.fItems.toArray(new BarItem[this.fItems.size()]);
+		BarItem[] bars= this.fItems.toArray(new BarItem[this.fItems.size()]);
 
 		// draw white background
 		Color bg= display.getSystemColor(SWT.COLOR_WHITE);
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 c9002a3..bca093a 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -113,7 +113,7 @@
 		// Create BarGraph
 		// TODO use FingerPrintGraph instead
 		BarGraph barGraph = null;
-		List allResults = new ArrayList();
+		List<ConfigResults> allResults = new ArrayList<>();
 		String defaultDimName = DB_Results.getDefaultDimension().getName();
 		for (int i=0, size=scenarios.size(); i<size; i++) {
 			ScenarioResults scenarioResults = (ScenarioResults) scenarios.get(i);
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/FingerPrintGraph.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/FingerPrintGraph.java
index 7fec6d6..808ad51 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/FingerPrintGraph.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/FingerPrintGraph.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -86,7 +86,7 @@
 	int imageHeight;
 	int graphWidth;
 	int graphHeight;
-	Map resources = new HashMap();
+	Map<String, Resource> resources = new HashMap<>();
 
 	// Data fields
 	int count = 0;
@@ -107,7 +107,7 @@
 	 * This area applies to a configuration results and is made of several zones.
 	 */
 	class BarGraphArea {
-		List zones;
+		List<AreaZone> zones;
 		private ConfigResults configResults;
 
 		/*
@@ -149,14 +149,14 @@
 
 		 BarGraphArea(ConfigResults results) {
 			this.configResults = results;
-			this.zones = new ArrayList();
+			this.zones = new ArrayList<>();
         }
 
 		void print(PrintStream stream) {
 			String url = this.configResults.getName() + "/" + ((ScenarioResults) this.configResults.getParent()).getFileName() + ".html";
 			int size = this.zones.size();
 			for (int i=0; i<size; i++) {
-				AreaZone zone = (AreaZone) this.zones.get(i);
+				AreaZone zone = this.zones.get(i);
 				zone.print(url, stream);
 			}
 		}
@@ -169,7 +169,7 @@
 	}
 
 
-FingerPrintGraph(File dir, String fileName, int width, List results) {
+FingerPrintGraph(File dir, String fileName, int width, List<ConfigResults> results) {
     super();
     this.imageWidth = width;
     this.count = results.size();
@@ -626,9 +626,9 @@
 	}
 
 	// Dispose created graphic resources
-	Iterator iterator = this.resources.values().iterator();
+	Iterator<Resource> iterator = this.resources.values().iterator();
 	while (iterator.hasNext()) {
-		Resource resource = (Resource) iterator.next();
+		Resource resource = iterator.next();
 		resource.dispose();
 	}
 	this.resources.clear();
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/RawDataTable.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/RawDataTable.java
index 124bdfa..14c45d2 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/RawDataTable.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/RawDataTable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -80,11 +80,11 @@
 	printColumnHeaders();
 	this.stream.print("</tr>\n");
 
-	List builds = this.configResults.getBuildsMatchingPrefixes(this.buildPrefixes);
+	List<BuildResults> builds = this.configResults.getBuildsMatchingPrefixes(this.buildPrefixes);
 	Collections.reverse(builds);
 	int size = builds.size();
 	for (int i=0; i<size; i++) {
-		BuildResults buildResults = (BuildResults) builds.get(i);
+		BuildResults buildResults = builds.get(i);
 		this.stream.print("<tr><td>");
 		this.stream.print(buildResults.getName());
 		this.stream.print("</td>");
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/ScenarioData.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/ScenarioData.java
index f23ef8b..9639411 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/ScenarioData.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/ScenarioData.java
@@ -45,7 +45,7 @@
  */
 public class ScenarioData {
 	private String baselinePrefix = null;
-	private List pointsOfInterest;
+	private List<String> pointsOfInterest;
 	private List buildIDStreamPatterns;
 	private File rootDir;
 	private static final int GRAPH_WIDTH = 600;
@@ -62,7 +62,7 @@
  * @param outputDir The directory root where the files are generated
  *
 */
-public ScenarioData(String baselinePrefix, List pointsOfInterest, List buildIDPatterns, File outputDir) {
+public ScenarioData(String baselinePrefix, List<String> pointsOfInterest, List buildIDPatterns, File outputDir) {
 	this.baselinePrefix = baselinePrefix;
 	this.pointsOfInterest = pointsOfInterest;
 	this.buildIDStreamPatterns = buildIDPatterns;
@@ -100,10 +100,10 @@
 	String current = configResults.getCurrentBuildName();
 
 	final String defaultBaselinePrefix = DB_Results.getDbBaselinePrefix();
-	Iterator builds = configResults.getResults();
+	Iterator<BuildResults> builds = configResults.getResults();
 	List lastSevenNightlyBuilds = configResults.lastNightlyBuildNames(7);
 	buildLoop: while (builds.hasNext()) {
-		BuildResults buildResults = (BuildResults) builds.next();
+		BuildResults buildResults = builds.next();
 		String buildID = buildResults.getName();
 		int underscoreIndex = buildID.indexOf('-');
 		String label = (underscoreIndex != -1 && buildID.equals(current)) ? buildID.substring(0, underscoreIndex) : buildID;
@@ -179,10 +179,10 @@
 		if (printStream != null) printStream.print("		+ "+configName);
 		final File outputDir = new File(this.rootDir, configName);
 		outputDir.mkdir();
-		Iterator components = performanceResults.getResults();
+		Iterator<ComponentResults> components = performanceResults.getResults();
 		while (components.hasNext()) {
 			if (printStream != null) printStream.print(".");
-			final ComponentResults componentResults = (ComponentResults) components.next();
+			final ComponentResults componentResults = components.next();
 
 			// Manage monitor
 			int percentage = (int) ((progress++ / total) * 100);
@@ -211,18 +211,18 @@
  * Print the summary file of the builds data.
  */
 void printSummary(String configName, String configBox, ComponentResults componentResults, File outputDir, SubMonitor subMonitor) {
-	Iterator scenarios = componentResults.getResults();
+	Iterator<ScenarioResults> scenarios = componentResults.getResults();
 	while (scenarios.hasNext()) {
 		List highlightedPoints = new ArrayList();
-		ScenarioResults scenarioResults = (ScenarioResults) scenarios.next();
+		ScenarioResults scenarioResults = scenarios.next();
 		ConfigResults configResults = scenarioResults.getConfigResults(configName);
 		if (configResults == null || !configResults.isValid()) continue;
 
 		// get latest points of interest matching
 		if (this.pointsOfInterest != null) {
-			Iterator buildPrefixes = this.pointsOfInterest.iterator();
+			Iterator<String> buildPrefixes = this.pointsOfInterest.iterator();
 			while (buildPrefixes.hasNext()) {
-				String buildPrefix = (String) buildPrefixes.next();
+				String buildPrefix = buildPrefixes.next();
 				List builds = configResults.getBuilds(buildPrefix);
 				if (buildPrefix.indexOf('*') <0 && buildPrefix.indexOf('?') < 0) {
 					if (builds.size() > 0) {
@@ -400,9 +400,9 @@
  * Print details file of the scenario builds data.
  */
 private void printDetails(String configName, String configBox, ComponentResults componentResults, File outputDir) {
-	Iterator scenarios = componentResults.getResults();
+	Iterator<ScenarioResults> scenarios = componentResults.getResults();
 	while (scenarios.hasNext()) {
-		ScenarioResults scenarioResults = (ScenarioResults) scenarios.next();
+		ScenarioResults scenarioResults = scenarios.next();
 		ConfigResults configResults = scenarioResults.getConfigResults(configName);
 		if (configResults == null || !configResults.isValid()) continue;
 		String scenarioName= scenarioResults.getName();
@@ -447,22 +447,14 @@
 	ImageData data = Utils.downSample(image);
 	ImageLoader il = new ImageLoader();
 	il.data = new ImageData[] { data };
-	OutputStream out = null;
-	try {
-		out = new BufferedOutputStream(new FileOutputStream(outputFile));
+	try (OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile))){
+
 		il.save(out, SWT.IMAGE_GIF);
 
-	} catch (FileNotFoundException e) {
+	} catch (IOException e) {
 		e.printStackTrace();
 	} finally {
 		image.dispose();
-		if (out != null) {
-			try {
-				out.close();
-			} catch (IOException e1) {
-				// silently ignored
-			}
-		}
 	}
 }
 }
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/TimeLineGraph.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/TimeLineGraph.java
index 4ecf316..928389a 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/TimeLineGraph.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/performance/ui/TimeLineGraph.java
@@ -26,11 +26,11 @@
 
 public class TimeLineGraph extends LineGraph{
 
-    Hashtable fItemGroups;
+    Hashtable<String, List<TimeLineGraphItem>> fItemGroups;
 
     public TimeLineGraph (String title, Dim dim) {
         super(title, dim);
-        this.fItemGroups=new Hashtable();
+        this.fItemGroups=new Hashtable<>();
     }
 
     @Override
@@ -81,12 +81,12 @@
 
         setCoordinates(right-left,left,bottom-top,bottom,max-min);
 
-        Enumeration _enum=this.fItemGroups.elements();
-        Comparator comparator=new TimeLineGraphItem.GraphItemComparator();
+        Enumeration<List<TimeLineGraphItem>> _enum=this.fItemGroups.elements();
+        Comparator<TimeLineGraphItem> comparator=new TimeLineGraphItem.GraphItemComparator();
 
         while (_enum.hasMoreElements()) {
- 			List items = (List) _enum.nextElement();
-			Object[] fItemsArray=items.toArray();
+ 			List<TimeLineGraphItem> items = _enum.nextElement();
+ 			TimeLineGraphItem[] fItemsArray=items.toArray(new TimeLineGraphItem[items.size()]);
 			Arrays.sort(fItemsArray,comparator);
 			int lastx = 0;
 			int lasty = 0;
@@ -94,7 +94,7 @@
 			int n = fItemsArray.length;
 
 			for (int i = 0; i < n; i++) {
-				TimeLineGraphItem thisItem = (TimeLineGraphItem) fItemsArray[i];
+				TimeLineGraphItem thisItem = fItemsArray[i];
 
 				int yposition = thisItem.y;
 				int xposition = thisItem.x;
@@ -161,9 +161,9 @@
 	}
 
     public void addItem(String groupName,String name, String description, double value, Color col, boolean display, long timestamp,boolean isSpecial,boolean drawBaseline) {
-      	List items = (List) this.fItemGroups.get(groupName);
+      	List<TimeLineGraphItem> items = this.fItemGroups.get(groupName);
   		if (this.fItemGroups.get(groupName) == null) {
-  			items=new ArrayList();
+  			items=new ArrayList<>();
   			this.fItemGroups.put(groupName, items);
   		}
   		items.add(new TimeLineGraphItem(name, description, value, col, display,
@@ -172,12 +172,12 @@
 
     @Override
     public double getMaxItem() {
-    	Enumeration _enum=this.fItemGroups.elements();
+    	Enumeration<List<TimeLineGraphItem>> _enum=this.fItemGroups.elements();
         double maxItem= 0;
     	while (_enum.hasMoreElements()) {
-			List items = (List) _enum.nextElement();
+			List<TimeLineGraphItem> items = _enum.nextElement();
 			for (int i = 0; i < items.size(); i++) {
-				TimeLineGraphItem graphItem = (TimeLineGraphItem) items.get(i);
+				TimeLineGraphItem graphItem = items.get(i);
 				if (graphItem.value > maxItem)
 					maxItem = graphItem.value;
 			}
@@ -189,13 +189,13 @@
 
     @Override
     public double getMinItem() {
-       	Enumeration _enum = this.fItemGroups.elements();
+       	Enumeration<List<TimeLineGraphItem>> _enum = this.fItemGroups.elements();
 		double minItem = getMaxItem();
 
 		while (_enum.hasMoreElements()) {
-			List items = (List) _enum.nextElement();
+			List<TimeLineGraphItem> items = _enum.nextElement();
 			for (int i = 0; i < items.size(); i++) {
-				TimeLineGraphItem graphItem = (TimeLineGraphItem) items.get(i);
+				TimeLineGraphItem graphItem = items.get(i);
 				if (graphItem.value < minItem)
 					minItem = graphItem.value;
 			}
@@ -205,21 +205,21 @@
         return minItem;
     }
 
-    private TimeLineGraphItem getMostRecent(Hashtable lineGraphGroups) {
-		Enumeration _enum = lineGraphGroups.elements();
+    private TimeLineGraphItem getMostRecent(Hashtable<String, List<TimeLineGraphItem>> lineGraphGroups) {
+		Enumeration<List<TimeLineGraphItem>> _enum = lineGraphGroups.elements();
 		long mostRecentTimestamp = 0;
 		TimeLineGraphItem mostRecentItem = null;
 
 		while (_enum.hasMoreElements()) {
-			List items = (List) _enum.nextElement();
+			List<TimeLineGraphItem> items = _enum.nextElement();
 			for (int i = 0; i < items.size(); i++) {
 				if (items.size() == 1)
-					return (TimeLineGraphItem) items.get(i);
+					return items.get(i);
 				else {
-					TimeLineGraphItem graphItem = (TimeLineGraphItem) items.get(i);
+					TimeLineGraphItem graphItem = items.get(i);
 					if (graphItem.timestamp > mostRecentTimestamp) {
 						mostRecentTimestamp = graphItem.timestamp;
-						mostRecentItem = (TimeLineGraphItem) items.get(i);
+						mostRecentItem = items.get(i);
 					}
 				}
 			}
@@ -229,12 +229,12 @@
 
     private void setCoordinates(int width, int xOffset, int height, int yOffset, int yValueRange){
 
-        List mainGroup=(ArrayList)this.fItemGroups.get("main");
-        List referenceGroup=(ArrayList)this.fItemGroups.get("reference");
+        List<TimeLineGraphItem> mainGroup=this.fItemGroups.get("main");
+        List<TimeLineGraphItem> referenceGroup=this.fItemGroups.get("reference");
 
-        Comparator comparator=new TimeLineGraphItem.GraphItemComparator();
+        Comparator<TimeLineGraphItem> comparator=new TimeLineGraphItem.GraphItemComparator();
 
- 		Object[] fItemsArray=mainGroup.toArray();
+        TimeLineGraphItem[] fItemsArray=mainGroup.toArray(new TimeLineGraphItem[mainGroup.size()]);
 		Arrays.sort(fItemsArray,comparator);
 
 		int n = mainGroup.size();
@@ -243,7 +243,7 @@
 //		double min=getMinItem()*0.8;
 
 		for (int i = 0; i < n; i++) {
-			TimeLineGraphItem thisItem = (TimeLineGraphItem) fItemsArray[i];
+			TimeLineGraphItem thisItem = fItemsArray[i];
 			thisItem.setX(xOffset + (i * xIncrement));
 			thisItem.setY((int)(PADDING+((max-thisItem.value) * (height)/(yValueRange))));
 
@@ -254,7 +254,7 @@
 
 		n = referenceGroup.size();
 		for (int i = 0; i < n; i++) {
-			 TimeLineGraphItem thisItem = (TimeLineGraphItem) referenceGroup.get(i);
+			 TimeLineGraphItem thisItem = referenceGroup.get(i);
 			 if (thisItem.timestamp==-1)
 				 thisItem.setX(xOffset + (i * (width/n)));
 			 else
@@ -266,9 +266,9 @@
     }
 
 
-	private void setRelativeXPosition (TimeLineGraphItem thisItem, List items){
-			Comparator comparator=new TimeLineGraphItem.GraphItemComparator();
-			Object[] fItemsArray=items.toArray();
+	private void setRelativeXPosition (TimeLineGraphItem thisItem, List<TimeLineGraphItem> items){
+			Comparator<TimeLineGraphItem> comparator=new TimeLineGraphItem.GraphItemComparator();
+			TimeLineGraphItem[] fItemsArray=items.toArray(new TimeLineGraphItem[items.size()]);
 			Arrays.sort(fItemsArray,comparator);
 
 			TimeLineGraphItem closestPrecedingItem=null;
@@ -278,7 +278,7 @@
 			long minimumTimeDiffFollowing=thisItem.timestamp;
 
 			for (int i=0;i<fItemsArray.length;i++){
-				TimeLineGraphItem anItem=(TimeLineGraphItem)fItemsArray[i];
+				TimeLineGraphItem anItem=fItemsArray[i];
 				long timeDiff=thisItem.timestamp-anItem.timestamp;
 
 				 if (timeDiff>0&&timeDiff<minimumTimeDiffPreceding){
