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 395a872..a1a9a9f 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
@@ -141,12 +141,10 @@
 
 public BuildResultsElement(AbstractResults results, ResultsElement parent) {
 	super(results, parent);
-	initInfo();
 }
 
 public BuildResultsElement(String name, ResultsElement parent) {
 	super(name, parent);
-	initInfo();
 }
 
 @Override
@@ -306,14 +304,6 @@
 	}
 }
 
-/*
- * Init information
- */
-void initInfo() {
-	this.milestone = Util.isMilestone(getName());
-	this.important = this.milestone || Util.getNextMilestone(this.name) == null;
-}
-
 @Override
 void initStatus() {
 	if (this.results == null) {
@@ -344,15 +334,6 @@
 	return this.important;
 }
 
-/**
- * Returns whether the build is a milestone one or not.
- *
- * @return <code>true</code>  or <code>false</code> .
- */
-public boolean isMilestone() {
-	return this.milestone;
-}
-
 public boolean isRead() {
 	return (getStatus()  & STATE_MASK) == READ;
 }
diff --git a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonView.java b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonView.java
index 944315b..5c8c3af 100644
--- a/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonView.java
+++ b/bundles/org.eclipse.test.performance.ui/src/org/eclipse/test/internal/performance/results/ui/BuildsComparisonView.java
@@ -34,7 +34,6 @@
 import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
 import org.eclipse.test.internal.performance.results.model.PerformanceResultsElement;
 import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IMemento;
 import org.eclipse.ui.IViewSite;
@@ -95,8 +94,6 @@
 public BuildsComparisonView() {
 	this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
 	this.preferences.addPreferenceChangeListener(this);
-	// TODO should be done only once!
-	Util.initMilestones(this.preferences);
 }
 
 /*
@@ -151,11 +148,11 @@
 	for (int i=0; i<length; i++) {
 		this.tabs[i] = new BuildsComparisonTab(components[i]);
 	}
-	for (int i=0; i<this.tabs.length; i++) {
+	for (BuildsComparisonTab tab : this.tabs) {
 		CTabItem item = new CTabItem (this.tabFolder, SWT.NONE);
-		item.setText (this.tabs[i].getTabText ());
-		item.setControl (this.tabs[i].createTabFolderPage(this));
-		item.setData (this.tabs[i]);
+		item.setText (tab.getTabText ());
+		item.setControl (tab.createTabFolderPage(this));
+		item.setData (tab);
 	}
 	this.tabFolder.setSelection(0);
 }
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 216328a..412c9f2 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
@@ -108,7 +108,6 @@
 	this.fullSelectionImageDescriptor = ImageDescriptor.createFromFile(getClass(), "icallout_obj.gif");
 	this.preferences = InstanceScope.INSTANCE.getNode(IPerformancesConstants.PLUGIN_ID);
 	this.preferences.addPreferenceChangeListener(this);
-	Util.initMilestones(this.preferences);
 }
 
 /*
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 a75a2fa..8b1042f 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
@@ -40,7 +40,6 @@
 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.IMemento;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.model.WorkbenchContentProvider;
@@ -130,14 +129,7 @@
 
 		@Override
     protected String decorateText(String input, Object element) {
-			String text = super.decorateText(input, element);
-			if (element instanceof BuildResultsElement) {
-				BuildResultsElement buildElement = (BuildResultsElement) element;
-				if (buildElement.isMilestone()) {
-					text = Util.getMilestoneName(buildElement.getName()) + " - "+text;
-				}
-			}
-			return text;
+			return super.decorateText(input, element);
 		}
 
 		// When all scenarios are displayed, then set fingerprints one in bold.
@@ -153,12 +145,6 @@
 					}
 				}
 			}
-			if (element instanceof BuildResultsElement) {
-				BuildResultsElement buildElement = (BuildResultsElement) element;
-				if (Util.isMilestone(buildElement.getName())) {
-					return getBoldFont(font);
-				}
-			}
 			return font;
 		}
 	};
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 88db8eb..167be2a 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
@@ -324,12 +324,6 @@
 	 */
 	private void fillTableLines(boolean fingerprints) {
 
-		// Get preferences information
-		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
 		if (this.results == null)
 			return;
@@ -351,28 +345,13 @@
 
 			// The first column is the build name
 			String buildName = (String) line.get(0);
-			String milestoneName = Util.getMilestoneName(buildName);
 			TableItem item = null;
 
 			// Set item if the line is not filtered
 			Font italic;
-			if (milestoneName != null) {
-				item = new TableItem(this.table, SWT.NONE);
-				item.setText(milestoneName + " - " + buildName);
-				item.setFont(0, this.boldFont);
-				if (!onlyMilestones)
-					item.setBackground(this.blueref);
-				italic = this.boldItalicFont;
-			} else {
-				if ((onlyMilestones && Util.getNextMilestone(buildName) != null)
-						|| (skipNightlyBuilds && buildName.charAt(0) == 'N')) {
-					// skip line
-					continue;
-				}
-				item = new TableItem(this.table, SWT.NONE);
-				item.setText(0, buildName);
-				italic = this.italicFont;
-			}
+			item = new TableItem(this.table, SWT.NONE);
+			item.setText(0, buildName);
+			italic = this.italicFont;
 
 			// Read each column value
 			String baselineName = null;
@@ -386,7 +365,7 @@
 				// Otherwise get values for a scenario
 				Font italic2 = italic;
 				ScenarioResultsElement scenarioResultsElement = (ScenarioResultsElement) scenarios[col - 1];
-				if (milestoneName != null || (!fingerprints && scenarioResultsElement.hasSummary())) {
+				if ((!fingerprints && scenarioResultsElement.hasSummary())) {
 					italic2 = this.boldItalicFont;
 					item.setFont(col, this.boldFont);
 				}
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 09773cf..0755e5f 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
@@ -68,19 +68,6 @@
 	defaultPreferences.putBoolean(PRE_FILTER_OLD_BUILDS, IPerformancesConstants.DEFAULT_FILTER_OLD_BUILDS);
 	defaultPreferences.putBoolean(PRE_FILTER_NIGHTLY_BUILDS, IPerformancesConstants.DEFAULT_FILTER_NIGHTLY_BUILDS);
 
-	// Milestones
-	String[] milestones = IPerformancesConstants.V36_MILESTONES;
-	String prefix = PRE_MILESTONE_BUILDS + "." + ECLIPSE_MAINTENANCE_VERSION;
-	length = milestones.length;
-	for (int i = 0; i < length; i++) {
-		defaultPreferences.put(prefix + i, milestones[i]);
-	}
-	milestones = IPerformancesConstants.V37_MILESTONES;
-	prefix = PRE_MILESTONE_BUILDS + "." + ECLIPSE_DEVELOPMENT_VERSION;
-	length = milestones.length;
-	for (int i = 0; i < length; i++) {
-		defaultPreferences.put(prefix + i, milestones[i]);
-	}
 }
 
 }
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 6f342be..98037fa 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
@@ -38,7 +38,6 @@
 import org.eclipse.test.internal.performance.PerformanceTestPlugin;
 import org.eclipse.test.internal.performance.results.db.DB_Results;
 import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
 import org.eclipse.test.performance.ui.UiPlugin;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPreferencePage;
@@ -60,7 +59,6 @@
 	private CCombo defaultDimensionCombo;
 //	private CCombo lastBuildCombo;
 	private List resultsDimensionsList;
-	private CCombo milestonesCombo;
 	private Label dbLocationLabel;
 
 	// Status SWT objects
@@ -231,12 +229,6 @@
 		this.comparisonThresholdImprovement = createTextField(thresholdsGroup);
 		this.comparisonThresholdImprovement.setToolTipText("The threshold in percentage to report an improvement");
 
-		// Milestones
-		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");
-
 		// Default dimension layout
 		StringBuilder tooltip = new StringBuilder("Select the default dimension which will be used for performance results\n");
 		tooltip.append("When changed, the new selected dimension is automatically added to the dimensions list below...");
@@ -523,16 +515,6 @@
 	}
     updateBrowseButtonToolTip(version);
 
-	// Milestones
-	this.milestonesCombo.removeAll();
-	String prefix = PRE_MILESTONE_BUILDS + "." + version;
-	String milestone = store.getDefaultString(prefix + "0");
-	int index = 0;
-	while (milestone != null && milestone.length() > 0) {
-		this.milestonesCombo.add(milestone);
-		milestone = store.getDefaultString(prefix + ++index);
-	}
-
 	// Init default default dimension
 	String defaultDimension = store.getDefaultString(PRE_DEFAULT_DIMENSION);
 	this.defaultDimensionCombo.setText(defaultDimension);
@@ -586,15 +568,6 @@
 	}
     updateBrowseButtonToolTip(version);
 
-	// Milestones
-	String prefix = PRE_MILESTONE_BUILDS + "." + version;
-	int index = 0;
-	String milestone = store.getString(prefix + index);
-	while (milestone != null && milestone.length() > 0) {
-		this.milestonesCombo.add(milestone);
-		milestone = store.getString(prefix + ++index);
-	}
-
 	// Init composite lists
 	initDimensionsLists();
 
@@ -702,130 +675,6 @@
 		this.resultsDimensionsList.setSelection(resultsDimensions);
 	}
 
-	// Add default dimension to results if necessary
-	if (event.getSource() == this.milestonesCombo) {
-
-		// Verify the only digits are entered
-		String milestoneDate = this.milestonesCombo.getText();
-		final int mLength = milestoneDate.length();
-		if (mLength > 0) {
-			for (int i=0; i<mLength; i++) {
-				if (!Character.isDigit(milestoneDate.charAt(i))) {
-					String[] items = this.milestonesCombo.getItems();
-					int length = items.length;
-					for (int j=0; j<length; j++) {
-						if (items[j].equals(milestoneDate)) {
-							return;
-						}
-					}
-					openMilestoneErrorMessage(milestoneDate);
-					return;
-				}
-			}
-		}
-
-		// Do not verify further until a complete milestone date is entered
-		if (mLength < 12) return;
-
-		// Verify the digits
-		try {
-			String str = milestoneDate.substring(0, 4);
-			int year = Integer.parseInt(str);
-			if (year < 2009 || year > 2020) { // 2020 should be enough!
-				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(), 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(), 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(), 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(), getDialogTitle(), milestoneDate+": "+str+" is invalid minutes, it should be only from 00 to 59!");
-				return;
-			}
-		}
-		catch (NumberFormatException nfe) {
-			openMilestoneErrorMessage(milestoneDate);
-		}
-
-		// Get combo info
-		String[] milestones = this.milestonesCombo.getItems();
-		int length = milestones.length;
-		String lastMilestone = length == 0 ? null : milestones[length-1];
-
-		// Verify that the added milestone is valid
-		char version = (char) ('0' + (this.mVersionRadioButton.getSelection()
-			? ECLIPSE_MAINTENANCE_VERSION
-			: ECLIPSE_DEVELOPMENT_VERSION) - 30);
-
-		// Verify that the milestone follow the last one
-		String milestoneName;
-		if (lastMilestone == null) {
-			// No previous last milestone
-			milestoneName = "M1";
-		} else {
-			// Compare with last milestone
-			if (lastMilestone.charAt(0) == 'M') {
-				char digit = lastMilestone.charAt(1);
-				if (digit == '6') {
-					// M6 is the last dvpt milestone
-					milestoneName = "RC1";
-				} else {
-					milestoneName = "M" +((char)(digit+1));
-				}
-			} else if (lastMilestone.startsWith("RC")) {
-				char digit = lastMilestone.charAt(2);
-				if (digit == '4') {
-					// RC4 is the last release candidate milestone
-					milestoneName = "R3_"+version;
-				} else {
-					milestoneName = "RC" +((char)(digit+1));
-				}
-			} else if (lastMilestone.startsWith("R3_"+version+"-")) {
-				milestoneName = "R3_" + version + "_1";
-			} else if (lastMilestone.startsWith("R3_"+version+"_")) {
-				char digit = lastMilestone.charAt(5);
-				milestoneName = "R3_" + version + "_" + ((char)(digit+1));
-			} else {
-				MessageDialog.openError(getShell(), getDialogTitle(), "Unexpected last milestone name: "+lastMilestone+"!");
-				return;
-			}
-
-			// Verify the date of the new milestone
-			int lastMilestoneDash = lastMilestone.indexOf('-');
-			final String lastMilestoneDate = lastMilestone.substring(lastMilestoneDash+1);
-			if (milestoneDate.compareTo(lastMilestoneDate) <= 0) {
-				// TODO improve this verification
-				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(), 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("");
-		}
-	}
-
 	// Verify the 'builds to confirm' number
 	if (event.getSource() == this.statusBuildsToConfirm) {
 		try {
@@ -962,11 +811,6 @@
 
 	// Set milestones
 	String prefix = PRE_MILESTONE_BUILDS + "." + version;
-	count  = this.milestonesCombo.getItemCount();
-	for (i=0; i<count; i++) {
-		store.putValue(prefix + i, this.milestonesCombo.getItem(i));
-	}
-	Util.setMilestones(this.milestonesCombo.getItems());
 
 	// Unset previous additional milestones
 	String milestone = store.getString(prefix + count);
@@ -998,16 +842,6 @@
 	}
 	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++) {
-		TableItem item = items[i];
-		store.putValue(PRE_CONFIG_DESCRIPTOR_NAME + "." + i, item.getText(0));
-		store.putValue(PRE_CONFIG_DESCRIPTOR_DESCRIPTION + "." + i, item.getText(1));
-	}
-	*/
 }
 
 @Override
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 feb3444..45ffaf8 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
@@ -46,7 +46,6 @@
 import org.eclipse.test.internal.performance.results.model.BuildResultsElement;
 import org.eclipse.test.internal.performance.results.model.PerformanceResultsElement;
 import org.eclipse.test.internal.performance.results.utils.IPerformancesConstants;
-import org.eclipse.test.internal.performance.results.utils.Util;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IMemento;
 import org.eclipse.ui.IViewPart;
@@ -187,8 +186,6 @@
 	// Init tool tip
 	setTitleToolTip();
 
-	// Init milestones
-	Util.initMilestones(this.preferences);
 }
 
 File changeDataDir(String lastBuild) {
@@ -367,7 +364,7 @@
 void hookContextMenu() {
 	MenuManager menuMgr = new MenuManager("#PopupMenu");
 	menuMgr.setRemoveAllWhenShown(true);
-	menuMgr.addMenuListener(manager -> fillContextMenu(manager));
+	menuMgr.addMenuListener(this::fillContextMenu);
 	Menu menu = menuMgr.createContextMenu(this.viewer.getControl());
 	this.viewer.getControl().setMenu(menu);
 	getSite().registerContextMenu(menuMgr, this.viewer);
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 ce44f2f..42a07a9 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
@@ -40,14 +40,9 @@
     String PRE_FILTER_OLD_BUILDS = PREFIX + "filter.non.milestones.builds"; //$NON-NLS-1$
     String PRE_FILTER_NIGHTLY_BUILDS = PREFIX + "filter.nightly.builds"; //$NON-NLS-1$
 
-	// Other constants
-	int ECLIPSE_MAINTENANCE_VERSION = 44;
-	int ECLIPSE_DEVELOPMENT_VERSION = 45;
-
 	// Default values
 	String DATABASE_NAME_PREFIX = "perfDb";
 	String NETWORK_DATABASE_LOCATION = "//shared/eclipse/databases/eclipseDB45/perfDb45:1528";
-	int DEFAULT_ECLIPSE_VERSION = ECLIPSE_DEVELOPMENT_VERSION;
 	boolean DEFAULT_FILTER_ADVANCED_SCENARIOS = true;
 	boolean DEFAULT_FILTER_OLD_BUILDS = false;
 	boolean DEFAULT_FILTER_NIGHTLY_BUILDS = false;
@@ -81,64 +76,8 @@
     String PRE_COMPARISON_THRESHOLD_IMPROVEMENT = PREFIX + "comparison.threshold.imporvement"; //$NON-NLS-1$
 	int DEFAULT_COMPARISON_THRESHOLD_IMPROVEMENT = 10;
 
-	// Default milestones nowadays
-	String[] V37_MILESTONES = new String[] {
-	};
-	String[] V36_MILESTONES = new String[] {
-		"M1-200908060100",
-		"M2-200909170100",
-		"M3-200910301201",
-		"M4-200912101301",
-		"M5-201001291300",
-		"M6-201003121448",
-	};
-	/** @deprecated */
-	@Deprecated String[] V35_MILESTONES = new String[] {
-		        "M1-200808071402",
-		        "M2-200809180100",
-		        "M3-200810301917",
-		        "M4-200812111908",
-		        "M5-200902021535",
-		        "M6-200903130100",
-		        "M7-200904302300",
-		        "RC1-200905151143",
-		        "RC2-200905221710",
-		        "RC3-200905282000",
-		        "RC4-200906051444",
-		        "R3_5-200906111540"
-	};
-	/** @deprecated */
-	@Deprecated String[] V34_MILESTONES = new String[] {
-		        "M1-200708091105",
-		        "M2-200709210919",
-		        "M3-200711012000",
-		        "M4-200712131700",
-		        "M5-200802071530",
-		        "M6a-200804091425",
-		        "M7-200805020100",
-		        "RC1-200805161333",
-		        "RC2-200805230100",
-		        "RC3-200805301730",
-		        "RC4-200806091311",
-		        "R3_4-200806172000"
-	};
-	/** @deprecated */
-	@Deprecated String[] V33_MILESTONES = new String[] {
-		        "M1-200608101230",
-		        "M2-200609220010",
-		        "M3-200611021715",
-		        "M4-200612141445",
-		        "M5-200702091006",
-		        "M5eh-200702220951",
-		        "M6-200703231616",
-		        "M7-200705031400",
-		        "RC1-200705171700",
-		        "RC2-200705251350",
-		        "RC3-200706011539",
-		        "RC4-200706081718",
-		        "R3_3-200706251500",
-		        "R3_3_1-200709211145",
-		        "R3_3_2-200802211800"
-	};
+	int ECLIPSE_DEVELOPMENT_VERSION = 418;
+	int DEFAULT_ECLIPSE_VERSION = ECLIPSE_DEVELOPMENT_VERSION;
+	int ECLIPSE_MAINTENANCE_VERSION = 417;
 
 }
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 f8236ef..b07eecc 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
@@ -30,7 +30,6 @@
 import java.util.Locale;
 import java.util.StringTokenizer;
 
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.test.internal.performance.results.db.BuildResults;
 import org.eclipse.test.internal.performance.results.db.DB_Results;
 
@@ -75,8 +74,6 @@
         BASELINE_BUILD_PREFIXES.add(DB_Results.getDbBaselinePrefix());
     }
 
-    // Milestones constants
-    private static String[]                 MILESTONES;
     public static final BuildDateComparator BUILD_DATE_COMPARATOR = new BuildDateComparator();
 
     // Components constants
@@ -101,34 +98,6 @@
         }
     }
 
-    private static void initMilestones() {
-        String version = DB_Results.getDbVersion();
-
-        // Initialize reference version and database directory
-        char mainVersion = version.charAt(1);
-        char minorVersion = version.charAt(2);
-
-        // Initialize milestones
-        if (mainVersion == '3') {
-            switch (minorVersion) {
-                case '3':
-                case '4':
-                case '5':
-                    throw new RuntimeException("Version " + mainVersion + '.' + minorVersion + " is no longer supported!");
-                case '6':
-                    MILESTONES = V36_MILESTONES;
-                    break;
-                case '7':
-                    MILESTONES = V37_MILESTONES;
-                    break;
-                default:
-                    throw new RuntimeException("Version " + mainVersion + '.' + minorVersion + " is not supported yet!");
-            }
-        } else {
-            throw new RuntimeException("Version " + mainVersion + '.' + minorVersion + " is not supported yet!");
-        }
-    }
-
     // Static information for time and date
     public static final int              ONE_MINUTE  = 60000;
     public static final long             ONE_HOUR    = 3600000L;
@@ -359,103 +328,6 @@
     }
 
     /**
-     * Returns the date of the milestone corresponding at the given index.
-     *
- * @param index The index of the milestone
-     * @return The date as a YYYYMMDD-hhmm string.
-     */
-    public static String getMilestoneDate(int index) {
-        int length = getMilestonesLength();
-	if (index >= length) return null;
-        int dash = MILESTONES[index].indexOf('-');
-        return MILESTONES[index].substring(dash + 1);
-    }
-
-    /**
-     * Returns the milestone matching the given build name.
-     *
- * @param buildName The name of the build
-     * @return The milestone as a string (e.g. M1)
-     */
-    public static String getMilestone(String buildName) {
-        if (buildName != null && buildName.length() >= 12) {
-            int length = getMilestonesLength();
-            String buildDate = getBuildDate(buildName, DB_Results.getDbBaselinePrefix());
-            for (int i = 0; i < length; i++) {
-                int start = MILESTONES[i].indexOf(buildDate);
-                if (start > 0) {
-                    return MILESTONES[i];
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the name the milestone matching the given build name.
-     *
- * @param buildName The name of the build
-     * @return The milestone name as a string (e.g. M1)
-     */
-    public static String getMilestoneName(String buildName) {
-        if (buildName != null && buildName.length() >= 12) {
-            int length = getMilestonesLength();
-            String buildDate = getBuildDate(buildName, DB_Results.getDbBaselinePrefix());
-            for (int i = 0; i < length; i++) {
-                int start = MILESTONES[i].indexOf(buildDate);
-                if (start > 0) {
-                    return MILESTONES[i].substring(0, start - 1);
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns whether the given build name is a milestone or not.
-     *
- * @param buildName The build name
-     * @return <code>true</code> if the build name matches a milestone one,
-     *         <code>false</code> otherwise.
-     */
-    public static boolean isMilestone(String buildName) {
-        return getMilestoneName(buildName) != null;
-    }
-
-    /**
-     * Returns the name of the milestone which run after the given build name or
-     * <code>null</code> if there's no milestone since the build has run.
-     *
-     * @param buildName
-     *            The build name
-     * @return <code>true</code> if the build name matches a milestone one,
-     *         <code>false</code> otherwise.
-     */
-    public static String getNextMilestone(String buildName) {
-        int length = getMilestonesLength();
-        String buildDate = getBuildDate(buildName);
-        for (int i = 0; i < length; i++) {
-            String milestoneDate = MILESTONES[i].substring(MILESTONES[i].indexOf('-') + 1);
-            if (milestoneDate.compareTo(buildDate) > 0) {
-                return milestoneDate;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Return the number of milestones.
-     *
-     * @return The number as an int
-     */
-    public static int getMilestonesLength() {
-        if (MILESTONES == null)
-            initMilestones();
-        int length = MILESTONES.length;
-        return length;
-    }
-
-    /**
      * @deprecated
      */
     @Deprecated
@@ -645,39 +517,4 @@
         // don't instantiate
     }
 
-    /**
-     * Set the milestones.
-     *
-     * @param items
-     *            The milestones list (e.g.
-     *            {@link IPerformancesConstants#V37_MILESTONES}).
-     */
-    public static void setMilestones(String[] items) {
-        MILESTONES = items;
-    }
-
-    /**
-     * Init the milestones from preferences
-     *
-     * @param preferences
-     *            The preferences from which got milestones list
-     */
-    public static void initMilestones(IEclipsePreferences preferences) {
-        int eclipseVersion = preferences.getInt(IPerformancesConstants.PRE_ECLIPSE_VERSION,
-                IPerformancesConstants.DEFAULT_ECLIPSE_VERSION);
-        String prefix = IPerformancesConstants.PRE_MILESTONE_BUILDS + "." + eclipseVersion;
-        int index = 0;
-        String milestone = preferences.get(prefix + index, null);
-        String[] milestones = new String[20];
-        while (milestone != null) {
-            milestones[index] = milestone;
-            index++;
-            milestone = preferences.get(prefix + index, null);
-        }
-        int length = milestones.length;
-        if (index < length) {
-            System.arraycopy(milestones, 0, milestones = new String[index], 0, index);
-        }
-        MILESTONES = milestones;
-    }
 }
