*** empty log message ***
diff --git a/update/org.eclipse.update.core/META-INF/MANIFEST.MF b/update/org.eclipse.update.core/META-INF/MANIFEST.MF
index 19640bd..cff7d4f 100644
--- a/update/org.eclipse.update.core/META-INF/MANIFEST.MF
+++ b/update/org.eclipse.update.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.update.core; singleton:=true
-Bundle-Version: 3.2.400.qualifier
+Bundle-Version: 3.2.401.qualifier
 Bundle-Activator: org.eclipse.update.internal.core.UpdateCore
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateCore.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateCore.java
index 0707949..f083f14 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateCore.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateCore.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2010 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
@@ -40,6 +40,7 @@
 	public static boolean DEBUG_SHOW_WEB;
 	public static boolean DEBUG_SHOW_IHANDLER;
 	public static boolean DEBUG_SHOW_RECONCILER;
+	public static boolean DEBUG_VERIFIER;
 		
 	private static final String PREFIX = "org.eclipse.update.core"; //$NON-NLS-1$
 	public static final String P_HISTORY_SIZE = PREFIX + ".historySize"; //$NON-NLS-1$
@@ -239,6 +240,7 @@
 			DEBUG_SHOW_WEB = getBooleanDebugOption("org.eclipse.update.core/debug/web", false); //$NON-NLS-1$
 			DEBUG_SHOW_IHANDLER = getBooleanDebugOption("org.eclipse.update.core/debug/installhandler", false); //$NON-NLS-1$
 			DEBUG_SHOW_RECONCILER = getBooleanDebugOption("org.eclipse.update.core/debug/reconciler", false); //$NON-NLS-1$
+			DEBUG_VERIFIER = getBooleanDebugOption("org.eclipse.equinox.p2.core/debug/verifier", false); // $NON-NLS-1$
 		}
 		
 		//
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/operations/OperationValidator.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/operations/OperationValidator.java
index 03af25b..77d0ba1 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/operations/OperationValidator.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/operations/OperationValidator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2010 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
@@ -10,12 +10,7 @@
  *******************************************************************************/
 package org.eclipse.update.internal.operations;
 
-//import java.io.*;
-//import java.net.*;
-//import java.nio.channels.*;
-import org.eclipse.update.core.IUpdateConstants;
-
-import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.osgi.framework.BundleContext;
 
 import java.io.File;
 import java.io.IOException;
@@ -32,6 +27,7 @@
 import org.eclipse.update.internal.configurator.PlatformConfiguration;
 import org.eclipse.update.internal.core.Messages;
 import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.internal.verifier.PlanVerifier;
 import org.eclipse.update.operations.IInstallFeatureOperation;
 import org.eclipse.update.operations.IOperationValidator;
 import org.osgi.framework.*;
@@ -40,6 +36,9 @@
  *  
  */
 public class OperationValidator implements IOperationValidator {
+
+	private static ServiceReference verifierServiceReference = null;
+
 	/**
 	 * Checks if the platform configuration has been modified outside this program.
 	 * @return the error status, or null if no errors
@@ -47,22 +46,20 @@
 	public IStatus validatePlatformConfigValid() {
 		ArrayList status = new ArrayList(1);
 		checkPlatformWasModified(status);
-		
+
 		// report status
 		if (status.size() > 0)
 			return createMultiStatus(Messages.ActivityConstraints_rootMessage, status, IStatus.ERROR);
 		return null;
 	}
-	
+
 	/*
 	 * Called by UI before performing operation. Returns null if no errors, a
 	 * status with IStatus.WARNING code when the initial configuration is
 	 * broken, or a status with IStatus.ERROR when there the operation
 	 * introduces new errors
 	 */
-	public IStatus validatePendingInstall(
-		IFeature oldFeature,
-		IFeature newFeature) {
+	public IStatus validatePendingInstall(IFeature oldFeature, IFeature newFeature) {
 		// check initial state
 		ArrayList beforeStatus = new ArrayList();
 		validateInitialState(beforeStatus);
@@ -113,9 +110,7 @@
 	/**
 	 * Called before performing operation.
 	 */
-	public IStatus validatePendingReplaceVersion(
-		IFeature feature,
-		IFeature anotherFeature) {
+	public IStatus validatePendingReplaceVersion(IFeature feature, IFeature anotherFeature) {
 		// check initial state
 		ArrayList beforeStatus = new ArrayList();
 		validateInitialState(beforeStatus);
@@ -129,7 +124,6 @@
 		return createCombinedReportStatus(beforeStatus, status);
 	}
 
-
 	/*
 	 * Called by the UI before doing a revert/ restore operation
 	 */
@@ -164,13 +158,13 @@
 		// report status
 		return createCombinedReportStatus(beforeStatus, status);
 	}
-	
+
 	/*
 	 * Called by the UI before doing a batched processing of several pending
 	 * changes.
 	 */
 	public RequiredFeaturesResult getRequiredFeatures(IInstallFeatureOperation[] jobs) {
-		
+
 		RequiredFeaturesResult requiredFeaturesResult = new RequiredFeaturesResult();
 		// check initial state
 		ArrayList beforeStatus = new ArrayList();
@@ -220,11 +214,9 @@
 	/*
 	 * handle unconfigure
 	 */
-	private static void validateUnconfigure(
-		IFeature feature,
-		ArrayList status) {
+	private static void validateUnconfigure(IFeature feature, ArrayList status) {
 		try {
-			checkSiteReadOnly(feature,status);
+			checkSiteReadOnly(feature, status);
 			ArrayList features = computeFeatures();
 			features = computeFeaturesAfterOperation(features, null, feature);
 			checkConstraints(features, status);
@@ -233,13 +225,12 @@
 		}
 	}
 
-
 	/*
 	 * handle configure
 	 */
 	private static void validateConfigure(IFeature feature, ArrayList status) {
 		try {
-			checkSiteReadOnly(feature,status);
+			checkSiteReadOnly(feature, status);
 			ArrayList features = computeFeatures();
 			checkOptionalChildConfiguring(feature, status);
 			checkForCycles(feature, null, features);
@@ -254,19 +245,12 @@
 	/*
 	 * handle replace version
 	 */
-	private static void validateReplaceVersion(
-		IFeature feature,
-		IFeature anotherFeature,
-		ArrayList status) {
+	private static void validateReplaceVersion(IFeature feature, IFeature anotherFeature, ArrayList status) {
 		try {
-			checkSiteReadOnly(feature,status);
+			checkSiteReadOnly(feature, status);
 			ArrayList features = computeFeatures();
 			checkForCycles(feature, null, features);
-			features =
-				computeFeaturesAfterOperation(
-					features,
-					anotherFeature,
-					feature);
+			features = computeFeaturesAfterOperation(features, anotherFeature, feature);
 			checkConstraints(features, status);
 		} catch (CoreException e) {
 			status.add(e.getStatus());
@@ -276,16 +260,12 @@
 	/*
 	 * handle install and update
 	 */
-	private static void validateInstall(
-		IFeature oldFeature,
-		IFeature newFeature,
-		ArrayList status) {
+	private static void validateInstall(IFeature oldFeature, IFeature newFeature, ArrayList status) {
 		try {
-			checkSiteReadOnly(oldFeature,status);
+			checkSiteReadOnly(oldFeature, status);
 			ArrayList features = computeFeatures();
 			checkForCycles(newFeature, null, features);
-			features =
-				computeFeaturesAfterOperation(features, newFeature, oldFeature);
+			features = computeFeaturesAfterOperation(features, newFeature, oldFeature);
 			checkConstraints(features, status);
 			checkLicense(newFeature, status);
 		} catch (CoreException e) {
@@ -296,14 +276,12 @@
 	/*
 	 * handle revert and restore
 	 */
-	private static void validateRevert(
-		IInstallConfiguration config,
-		ArrayList status) {
+	private static void validateRevert(IInstallConfiguration config, ArrayList status) {
 		try {
-//			// check the timeline and don't bother
-//			// to check anything else if negative
-//			if (!checkTimeline(config, status))
-//				return;
+			//			// check the timeline and don't bother
+			//			// to check anything else if negative
+			//			if (!checkTimeline(config, status))
+			//				return;
 			ArrayList features = computeFeaturesAfterRevert(config);
 			checkConstraints(features, status);
 			checkRevertConstraints(features, status);
@@ -313,17 +291,14 @@
 		}
 	}
 
-
 	/*
 	 * Handle one-click changes as a batch
 	 */
-	private static Set validatePendingChanges(
-		IInstallFeatureOperation[] jobs,
-		ArrayList status,
-		ArrayList beforeStatus) {
+	private static Set validatePendingChanges(IInstallFeatureOperation[] jobs, ArrayList status, ArrayList beforeStatus) {
 		try {
 			ArrayList features = computeFeatures();
-			ArrayList savedFeatures = features;
+			ArrayList savedFeatures = (ArrayList) features.clone();
+
 			int nexclusives = 0;
 
 			// pass 1: see if we can process the entire "batch"
@@ -336,19 +311,13 @@
 				checkLicense(newFeature, status);
 				if (jobs.length > 1 && newFeature.isExclusive()) {
 					nexclusives++;
-					status.add(
-						createStatus(
-							newFeature,
-							FeatureStatus.CODE_EXCLUSIVE,
-							Messages.ActivityConstraints_exclusive));
+					status.add(createStatus(newFeature, FeatureStatus.CODE_EXCLUSIVE, Messages.ActivityConstraints_exclusive));
 					continue;
 				}
 				checkForCycles(newFeature, null, features);
-				features =
-					computeFeaturesAfterOperation(
-						features,
-						newFeature,
-						oldFeature);
+				features = computeFeaturesAfterOperation(features, newFeature, oldFeature);
+				// give clients the opportunity to veto the plan
+				verifyPlan(job, savedFeatures, features, status);
 			}
 			if (nexclusives > 0)
 				return Collections.EMPTY_SET;
@@ -357,48 +326,111 @@
 				return Collections.EMPTY_SET;
 
 			// pass 2: we have conflicts
-			features = savedFeatures;
+			features = (ArrayList) savedFeatures.clone();
 			for (int i = 0; i < jobs.length; i++) {
 				IInstallFeatureOperation job = jobs[i];
 				IFeature newFeature = job.getFeature();
 				IFeature oldFeature = job.getOldFeature();
 
-				features =
-					computeFeaturesAfterOperation(
-						features,
-						newFeature,
-						oldFeature);
+				features = computeFeaturesAfterOperation(features, newFeature, oldFeature);
 
 				Set result = checkConstraints(features, status);
-				if (status.size() > 0
-					&& !isBetterStatus(beforeStatus, status)) {
-// bug 75613
-//					IStatus conflict =
-//						createStatus(
-//							newFeature,
-//							FeatureStatus.CODE_OTHER,
-//							Policy.bind(KEY_CONFLICT));
-//					status.add(0, conflict);
+
+				// give clients the opportunity to veto the plan
+				verifyPlan(job, savedFeatures, features, status);
+
+				if (status.size() > 0 && !isBetterStatus(beforeStatus, status)) {
+					// bug 75613
+					//					IStatus conflict =
+					//						createStatus(
+					//							newFeature,
+					//							FeatureStatus.CODE_OTHER,
+					//							Policy.bind(KEY_CONFLICT));
+					//					status.add(0, conflict);
 					return result;
 				}
 			}
 		} catch (CoreException e) {
 			status.add(e.getStatus());
+		} finally {
+			if (verifierServiceReference != null) {
+				BundleContext context = UpdateCore.getPlugin().getBundleContext();
+				if (context != null)
+					context.ungetService(verifierServiceReference);
+			}
 		}
-		
+
 		return Collections.EMPTY_SET;
 	}
-	
+
+	/*
+	 * Load and return the plan verifier if there is one registered and we don't have verification disabled.
+	 */
+	private static ServiceReference loadVerifier() {
+		final BundleContext context = UpdateCore.getPlugin().getBundleContext();
+		if (context == null)
+			return null;
+		String value = context.getProperty("eclipse.p2.verifyPlan"); //$NON-NLS-1$
+		if ("false".equalsIgnoreCase(value)) { //$NON-NLS-1$
+			if (UpdateCore.DEBUG_VERIFIER)
+				UpdateCore.debug("Plan verification disabled by user."); //$NON-NLS-1$
+			return null;
+		}
+		verifierServiceReference = context.getServiceReference(PlanVerifier.class.getName());
+		return verifierServiceReference;
+	}
+
+	/*
+	 * Give clients the opportunity to veto install/update changes. 
+	 */
+	private static void verifyPlan(final IInstallFeatureOperation installOperation, final ArrayList currentFeatures, final ArrayList featuresAfterOperation, final ArrayList status) {
+		ServiceReference ref = loadVerifier();
+		BundleContext context = UpdateCore.getPlugin().getBundleContext();
+		final PlanVerifier verifier;
+		if (context == null || ref == null)
+			verifier = null;
+		else
+			verifier = (PlanVerifier) context.getService(ref);
+		if (verifier == null) {
+			if (UpdateCore.DEBUG_VERIFIER)
+				UpdateCore.debug("No plan verifier available. Skipping plan verification."); //$NON-NLS-1$
+			return;
+		}
+		ISafeRunnable job = new ISafeRunnable() {
+			public void handleException(Throwable exception) {
+				if (UpdateCore.DEBUG_VERIFIER)
+					UpdateCore.debug("Exception while running verifier. Check log for details."); //$NON-NLS-1$
+				// log the exception 
+				UpdateCore.log("Exception while running plan verifier.", exception); //$NON-NLS-1$
+				// don't let a bad verifier prevent the operation. fall through and return OK so execution of the plan continues
+			}
+
+			public void run() throws Exception {
+				if (UpdateCore.DEBUG_VERIFIER)
+					UpdateCore.debug("Running plan verifier."); //$NON-NLS-1$
+				long start = System.currentTimeMillis();
+				verifier.verify(installOperation, currentFeatures, featuresAfterOperation, status);
+				if (UpdateCore.DEBUG_VERIFIER)
+					UpdateCore.debug("Verification complete in " + (System.currentTimeMillis() - start) + "ms."); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		};
+		try {
+			SafeRunner.run(job);
+		} finally {
+			context.ungetService(ref);
+		}
+	}
+
 	private static void checkPlatformWasModified(ArrayList status) {
 		try {
 			// checks if the platform has been modified outside this eclipse instance
 			IPlatformConfiguration platformConfig = ConfiguratorUtils.getCurrentPlatformConfiguration();
-			
+
 			long currentTimeStamp = platformConfig.getChangeStamp();
 			// get the last modified value for this config, from this process point of view
-			if (platformConfig instanceof PlatformConfiguration) 
-				currentTimeStamp = ((PlatformConfiguration)platformConfig).getConfiguration().lastModified();
-				
+			if (platformConfig instanceof PlatformConfiguration)
+				currentTimeStamp = ((PlatformConfiguration) platformConfig).getConfiguration().lastModified();
+
 			// get the real last modified value
 			URL platformXML = platformConfig.getConfigurationLocation();
 			long actualTimeStamp = currentTimeStamp;
@@ -409,23 +441,19 @@
 				actualTimeStamp = connection.getLastModified();
 			}
 			if (currentTimeStamp != actualTimeStamp)
-				status.add(createStatus(
-								null,
-								FeatureStatus.CODE_OTHER,
-								Messages.ActivityConstraints_platformModified)); 
+				status.add(createStatus(null, FeatureStatus.CODE_OTHER, Messages.ActivityConstraints_platformModified));
 		} catch (IOException e) {
 			// ignore
 		}
 	}
-	
+
 	private static void checkSiteReadOnly(IFeature feature, ArrayList status) {
-		if(feature == null){
+		if (feature == null) {
 			return;
 		}
 		IConfiguredSite csite = feature.getSite().getCurrentConfiguredSite();
 		if (csite != null && !csite.isUpdatable())
-			status.add(createStatus(feature, FeatureStatus.CODE_OTHER,
-					NLS.bind(Messages.ActivityConstraints_readOnly, (new String[] { csite.getSite().getURL().toExternalForm() }))));
+			status.add(createStatus(feature, FeatureStatus.CODE_OTHER, NLS.bind(Messages.ActivityConstraints_readOnly, (new String[] {csite.getSite().getURL().toExternalForm()}))));
 	}
 
 	/*
@@ -434,11 +462,11 @@
 	private static ArrayList computeFeatures() throws CoreException {
 		return computeFeatures(true);
 	}
+
 	/*
 	 * Compute a list of configured features
 	 */
-	private static ArrayList computeFeatures(boolean configuredOnly)
-		throws CoreException {
+	private static ArrayList computeFeatures(boolean configuredOnly) throws CoreException {
 		ArrayList features = new ArrayList();
 		ILocalSite localSite = SiteManager.getLocalSite();
 		IInstallConfiguration config = localSite.getCurrentConfiguration();
@@ -467,14 +495,7 @@
 	 * Compute the nested feature subtree starting at the specified base
 	 * feature
 	 */
-	public static ArrayList computeFeatureSubtree(
-			IFeature top,
-			IFeature feature,
-			ArrayList features,
-			boolean tolerateMissingChildren,
-			ArrayList configuredFeatures,
-			ArrayList visitedFeatures)
-	throws CoreException {
+	public static ArrayList computeFeatureSubtree(IFeature top, IFeature feature, ArrayList features, boolean tolerateMissingChildren, ArrayList configuredFeatures, ArrayList visitedFeatures) throws CoreException {
 
 		// check arguments
 		if (top == null)
@@ -488,8 +509,7 @@
 
 		// check for <includes> cycle
 		if (visitedFeatures.contains(feature)) {
-			IStatus status =
-			createStatus(top, FeatureStatus.CODE_CYCLE, Messages.ActivityConstraints_cycle);
+			IStatus status = createStatus(top, FeatureStatus.CODE_CYCLE, Messages.ActivityConstraints_cycle);
 			throw new CoreException(status);
 		} else {
 			// keep track of visited features so we can detect cycles
@@ -499,19 +519,11 @@
 		// return specified base feature and all its children
 		if (!features.contains(feature))
 			features.add(feature);
-		IIncludedFeatureReference[] children =
-		feature.getIncludedFeatureReferences();
+		IIncludedFeatureReference[] children = feature.getIncludedFeatureReferences();
 		for (int i = 0; i < children.length; i++) {
 			try {
 				IFeature child = UpdateUtils.getIncludedFeature(feature, children[i]);
-				features =
-				computeFeatureSubtree(
-						top,
-						child,
-						features,
-						tolerateMissingChildren,
-						null,
-						visitedFeatures);
+				features = computeFeatureSubtree(top, child, features, tolerateMissingChildren, null, visitedFeatures);
 			} catch (CoreException e) {
 				if (!children[i].isOptional() && !tolerateMissingChildren)
 					throw e;
@@ -529,31 +541,18 @@
 			if (license != null && license.trim().length() > 0)
 				return;
 		}
-		status.add(
-			createStatus(feature, FeatureStatus.CODE_OTHER, Messages.ActivityConstraints_noLicense));
+		status.add(createStatus(feature, FeatureStatus.CODE_OTHER, Messages.ActivityConstraints_noLicense));
 	}
 
 	/*
 	 * Compute a list of features that will be configured after the operation
 	 */
-	private static ArrayList computeFeaturesAfterOperation(
-		ArrayList features,
-		IFeature add,
-		IFeature remove)
-		throws CoreException {
+	private static ArrayList computeFeaturesAfterOperation(ArrayList features, IFeature add, IFeature remove) throws CoreException {
 
 		ArrayList addTree = computeFeatureSubtree(add, null, null, false,
 		/* do not tolerate missing children */
 		features, null);
-		ArrayList removeTree =
-			computeFeatureSubtree(
-				remove,
-				null,
-				null,
-				true /* tolerate missing children */,
-				null,
-				null
-		);
+		ArrayList removeTree = computeFeatureSubtree(remove, null, null, true /* tolerate missing children */, null, null);
 		if (remove != null) {
 			// Patches to features are removed together with
 			// those features. Include them in the list.
@@ -569,11 +568,7 @@
 		return features;
 	}
 
-	private static void contributePatchesFor(
-		ArrayList removeTree,
-		ArrayList features,
-		ArrayList result)
-		throws CoreException {
+	private static void contributePatchesFor(ArrayList removeTree, ArrayList features, ArrayList result) throws CoreException {
 
 		for (int i = 0; i < removeTree.size(); i++) {
 			IFeature feature = (IFeature) removeTree.get(i);
@@ -581,16 +576,11 @@
 		}
 	}
 
-	private static void contributePatchesFor(
-		IFeature feature,
-		ArrayList features,
-		ArrayList result)
-		throws CoreException {
+	private static void contributePatchesFor(IFeature feature, ArrayList features, ArrayList result) throws CoreException {
 		for (int i = 0; i < features.size(); i++) {
 			IFeature candidate = (IFeature) features.get(i);
 			if (UpdateUtils.isPatch(feature, candidate)) {
-				ArrayList removeTree =
-					computeFeatureSubtree(candidate, null, null, true,null,null);
+				ArrayList removeTree = computeFeatureSubtree(candidate, null, null, true, null, null);
 				result.addAll(removeTree);
 			}
 		}
@@ -600,8 +590,7 @@
 	 * Compute a list of features that will be configured after performing the
 	 * revert
 	 */
-	private static ArrayList computeFeaturesAfterRevert(IInstallConfiguration config)
-		throws CoreException {
+	private static ArrayList computeFeaturesAfterRevert(IInstallConfiguration config) throws CoreException {
 
 		ArrayList list = new ArrayList();
 		IConfiguredSite[] csites = config.getConfiguredSites();
@@ -615,13 +604,10 @@
 		return list;
 	}
 
-
-
 	/*
 	 * Compute a list of plugin entries for the specified features.
 	 */
-	private static ArrayList computePluginsForFeatures(ArrayList features)
-		throws CoreException {
+	private static ArrayList computePluginsForFeatures(ArrayList features) throws CoreException {
 		if (features == null)
 			return new ArrayList();
 
@@ -639,7 +625,6 @@
 		return result;
 	}
 
-
 	/**
 	 * Check for feature cycles:
 	 * - visit feature
@@ -647,11 +632,7 @@
 	 * - DFS children 
 	 * - when return from DFS remove the feature from the candidates list
 	 */
-	private static void checkForCycles(
-			IFeature feature,
-			ArrayList candidates,
-			ArrayList configuredFeatures)
-	throws CoreException {
+	private static void checkForCycles(IFeature feature, ArrayList candidates, ArrayList configuredFeatures) throws CoreException {
 
 		// check arguments
 		if (feature == null)
@@ -660,21 +641,19 @@
 			configuredFeatures = new ArrayList();
 		if (candidates == null)
 			candidates = new ArrayList();
-		
+
 		// check for <includes> cycle
 		if (candidates.contains(feature)) {
-			String msg = NLS.bind(Messages.ActivityConstraints_cycle, (new String[] {feature.getLabel(), 
-            feature.getVersionedIdentifier().toString()}));
+			String msg = NLS.bind(Messages.ActivityConstraints_cycle, (new String[] {feature.getLabel(), feature.getVersionedIdentifier().toString()}));
 			IStatus status = createStatus(feature, FeatureStatus.CODE_CYCLE, msg);
 			throw new CoreException(status);
 		}
 
 		// potential candidate
 		candidates.add(feature);
-		
+
 		// recursively, check cycles with children
-		IIncludedFeatureReference[] children =
-		feature.getIncludedFeatureReferences();
+		IIncludedFeatureReference[] children = feature.getIncludedFeatureReferences();
 		for (int i = 0; i < children.length; i++) {
 			try {
 				IFeature child = UpdateUtils.getIncludedFeature(feature, children[i]);
@@ -687,12 +666,11 @@
 		// no longer a candidate, because no cycles with children
 		candidates.remove(feature);
 	}
-	
+
 	/*
 	 * validate constraints
 	 */
-	private static Set  checkConstraints(ArrayList features, ArrayList status)
-		throws CoreException {
+	private static Set checkConstraints(ArrayList features, ArrayList status) throws CoreException {
 		if (features == null)
 			return Collections.EMPTY_SET;
 
@@ -708,9 +686,7 @@
 	 * Verify all features are either portable, or match the current
 	 * environment
 	 */
-	private static void checkEnvironment(
-		ArrayList features,
-		ArrayList status) {
+	private static void checkEnvironment(ArrayList features, ArrayList status) {
 
 		String os = Platform.getOS();
 		String ws = Platform.getWS();
@@ -724,8 +700,7 @@
 
 			if (fos.size() > 0) {
 				if (!fos.contains(os)) {
-					IStatus s =
-						createStatus(feature, FeatureStatus.CODE_ENVIRONMENT, Messages.ActivityConstraints_os);
+					IStatus s = createStatus(feature, FeatureStatus.CODE_ENVIRONMENT, Messages.ActivityConstraints_os);
 					if (!status.contains(s))
 						status.add(s);
 					continue;
@@ -734,8 +709,7 @@
 
 			if (fws.size() > 0) {
 				if (!fws.contains(ws)) {
-					IStatus s =
-						createStatus(feature, FeatureStatus.CODE_ENVIRONMENT, Messages.ActivityConstraints_ws);
+					IStatus s = createStatus(feature, FeatureStatus.CODE_ENVIRONMENT, Messages.ActivityConstraints_ws);
 					if (!status.contains(s))
 						status.add(s);
 					continue;
@@ -744,8 +718,7 @@
 
 			if (farch.size() > 0) {
 				if (!farch.contains(arch)) {
-					IStatus s =
-						createStatus(feature, FeatureStatus.CODE_ENVIRONMENT, Messages.ActivityConstraints_arch);
+					IStatus s = createStatus(feature, FeatureStatus.CODE_ENVIRONMENT, Messages.ActivityConstraints_arch);
 					if (!status.contains(s))
 						status.add(s);
 					continue;
@@ -757,10 +730,7 @@
 	/*
 	 * Verify we end up with a version of platform configured
 	 */
-	private static void checkPlatformFeature(
-		ArrayList features,
-		ArrayList plugins,
-		ArrayList status) {
+	private static void checkPlatformFeature(ArrayList features, ArrayList plugins, ArrayList status) {
 
 		// find the plugin that defines the product
 		IProduct product = Platform.getProduct();
@@ -776,10 +746,9 @@
 				break;
 			}
 		}
-		
+
 		if (!found) {
-			IStatus s =
-				createStatus(null, FeatureStatus.CODE_OTHER, Messages.ActivityConstraints_platform);
+			IStatus s = createStatus(null, FeatureStatus.CODE_OTHER, Messages.ActivityConstraints_platform);
 			if (!status.contains(s))
 				status.add(s);
 		}
@@ -788,25 +757,18 @@
 	/*
 	 * Verify we end up with a version of primary feature configured
 	 */
-	private static void checkPrimaryFeature(
-		ArrayList features,
-		ArrayList plugins,
-		ArrayList status) {
+	private static void checkPrimaryFeature(ArrayList features, ArrayList plugins, ArrayList status) {
 
-		String featureId =
-			ConfiguratorUtils
-				.getCurrentPlatformConfiguration()
-				.getPrimaryFeatureIdentifier();
-		
+		String featureId = ConfiguratorUtils.getCurrentPlatformConfiguration().getPrimaryFeatureIdentifier();
+
 		if (featureId != null) {
 			// primary feature is defined
 			for (int i = 0; i < features.size(); i++) {
 				IFeature feature = (IFeature) features.get(i);
-				if (featureId
-					.equals(feature.getVersionedIdentifier().getIdentifier()))
+				if (featureId.equals(feature.getVersionedIdentifier().getIdentifier()))
 					return;
 			}
-	
+
 			IStatus s = createStatus(null, FeatureStatus.CODE_OTHER, Messages.ActivityConstraints_primary);
 			if (!status.contains(s))
 				status.add(s);
@@ -825,8 +787,7 @@
 					return; // product found
 				}
 			}
-			IStatus s =
-				createStatus(null, FeatureStatus.CODE_OTHER, Messages.ActivityConstraints_primary);
+			IStatus s = createStatus(null, FeatureStatus.CODE_OTHER, Messages.ActivityConstraints_primary);
 			if (!status.contains(s))
 				status.add(s);
 		}
@@ -835,11 +796,8 @@
 	/*
 	 * Verify we do not break prereqs
 	 */
-	private static Set checkPrereqs(
-		ArrayList features,
-		ArrayList plugins,
-		ArrayList status) {
-		
+	private static Set checkPrereqs(ArrayList features, ArrayList plugins, ArrayList status) {
+
 		HashSet result = new HashSet();
 
 		for (int i = 0; i < features.size(); i++) {
@@ -853,12 +811,8 @@
 				VersionedIdentifier iid = iimport.getVersionedIdentifier();
 				String id = iid.getIdentifier();
 				PluginVersionIdentifier version = iid.getVersion();
-				boolean featurePrereq =
-					iimport.getKind() == IImport.KIND_FEATURE;
-				boolean ignoreVersion =
-					version.getMajorComponent() == 0
-						&& version.getMinorComponent() == 0
-						&& version.getServiceComponent() == 0;
+				boolean featurePrereq = iimport.getKind() == IImport.KIND_FEATURE;
+				boolean ignoreVersion = version.getMajorComponent() == 0 && version.getMinorComponent() == 0 && version.getServiceComponent() == 0;
 				int rule = iimport.getRule();
 				if (rule == IUpdateConstants.RULE_NONE)
 					rule = IUpdateConstants.RULE_COMPATIBLE;
@@ -890,27 +844,19 @@
 						// have a candidate
 						if (ignoreVersion)
 							found = true;
-						else if (
-							rule == IUpdateConstants.RULE_PERFECT
-								&& cversion.isPerfect(version))
+						else if (rule == IUpdateConstants.RULE_PERFECT && cversion.isPerfect(version))
 							found = true;
-						else if (
-							rule == IUpdateConstants.RULE_EQUIVALENT
-								&& cversion.isEquivalentTo(version))
+						else if (rule == IUpdateConstants.RULE_EQUIVALENT && cversion.isEquivalentTo(version))
 							found = true;
-						else if (
-							rule == IUpdateConstants.RULE_COMPATIBLE
-								&& cversion.isCompatibleWith(version))
+						else if (rule == IUpdateConstants.RULE_COMPATIBLE && cversion.isCompatibleWith(version))
 							found = true;
-						else if (
-							rule == IUpdateConstants.RULE_GREATER_OR_EQUAL
-								&& cversion.isGreaterOrEqualTo(version))
+						else if (rule == IUpdateConstants.RULE_GREATER_OR_EQUAL && cversion.isGreaterOrEqualTo(version))
 							found = true;
 					}
 					if (found)
 						break;
 				}
-				
+
 				// perhaps the bundle that we are looking for was installed
 				// but isn't a part of a feature
 				if (!found && !featurePrereq)
@@ -918,41 +864,19 @@
 
 				if (!found) {
 					// report status
-					String target =
-						featurePrereq
-							? Messages.ActivityConstaints_prereq_feature
-							: Messages.ActivityConstaints_prereq_plugin;
-					int errorCode = featurePrereq
-							? FeatureStatus.CODE_PREREQ_FEATURE
-							: FeatureStatus.CODE_PREREQ_PLUGIN;
-					String msg =
-						NLS.bind(Messages.ActivityConstraints_prereq, (new String[] { target, id }));
+					String target = featurePrereq ? Messages.ActivityConstaints_prereq_feature : Messages.ActivityConstaints_prereq_plugin;
+					int errorCode = featurePrereq ? FeatureStatus.CODE_PREREQ_FEATURE : FeatureStatus.CODE_PREREQ_PLUGIN;
+					String msg = NLS.bind(Messages.ActivityConstraints_prereq, (new String[] {target, id}));
 
 					if (!ignoreVersion) {
 						if (rule == IUpdateConstants.RULE_PERFECT)
-							msg =
-								NLS.bind(Messages.ActivityConstraints_prereqPerfect, (new String[] {
-                                target,
-                                id,
-                                version.toString()}));
+							msg = NLS.bind(Messages.ActivityConstraints_prereqPerfect, (new String[] {target, id, version.toString()}));
 						else if (rule == IUpdateConstants.RULE_EQUIVALENT)
-							msg =
-								NLS.bind(Messages.ActivityConstraints_prereqEquivalent, (new String[] {
-                                target,
-                                id,
-                                version.toString()}));
+							msg = NLS.bind(Messages.ActivityConstraints_prereqEquivalent, (new String[] {target, id, version.toString()}));
 						else if (rule == IUpdateConstants.RULE_COMPATIBLE)
-							msg =
-								NLS.bind(Messages.ActivityConstraints_prereqCompatible, (new String[] {
-                                target,
-                                id,
-                                version.toString()}));
+							msg = NLS.bind(Messages.ActivityConstraints_prereqCompatible, (new String[] {target, id, version.toString()}));
 						else if (rule == IUpdateConstants.RULE_GREATER_OR_EQUAL)
-							msg =
-								NLS.bind(Messages.ActivityConstraints_prereqGreaterOrEqual, (new String[] {
-                                target,
-                                id,
-                                version.toString()}));
+							msg = NLS.bind(Messages.ActivityConstraints_prereqGreaterOrEqual, (new String[] {target, id, version.toString()}));
 					}
 					IStatus s = createStatus(feature, errorCode, msg);
 					result.add(new InternalImport(iimport));
@@ -961,10 +885,10 @@
 				}
 			}
 		}
-		
+
 		return result;
 	}
-	
+
 	/*
 	 * Return a boolean value indicating whether or not the bundle with the given id and version
 	 * is installed in the system.
@@ -984,7 +908,7 @@
 			BundleDescription[] bundles = state.getBundles(id);
 			if (bundles == null || bundles.length == 0)
 				return false;
-			for (int i=0; i<bundles.length; i++) {
+			for (int i = 0; i < bundles.length; i++) {
 				BundleDescription bundle = bundles[i];
 				PluginVersionIdentifier cversion = new PluginVersionIdentifier(bundle.getVersion().toString());
 				// have a candidate
@@ -1008,21 +932,12 @@
 	/*
 	 * Verify we end up with valid nested features after revert
 	 */
-	private static void checkRevertConstraints(
-		ArrayList features,
-		ArrayList status) {
+	private static void checkRevertConstraints(ArrayList features, ArrayList status) {
 
 		for (int i = 0; i < features.size(); i++) {
 			IFeature feature = (IFeature) features.get(i);
 			try {
-				computeFeatureSubtree(
-					feature,
-					null,
-					null,
-					false /* do not tolerate missing children */,
-					null,
-					null
-				);
+				computeFeatureSubtree(feature, null, null, false /* do not tolerate missing children */, null, null);
 			} catch (CoreException e) {
 				status.add(e.getStatus());
 			}
@@ -1034,10 +949,7 @@
 	 * the child to be configured as well
 	 */
 
-	private static void checkOptionalChildConfiguring(
-		IFeature feature,
-		ArrayList status)
-		throws CoreException {
+	private static void checkOptionalChildConfiguring(IFeature feature, ArrayList status) throws CoreException {
 		ILocalSite localSite = SiteManager.getLocalSite();
 		IInstallConfiguration config = localSite.getCurrentConfiguration();
 		IConfiguredSite[] csites = config.getConfiguredSites();
@@ -1045,8 +957,7 @@
 		boolean included = false;
 		for (int i = 0; i < csites.length; i++) {
 			IConfiguredSite csite = csites[i];
-			ISiteFeatureReference[] crefs =
-				csite.getSite().getFeatureReferences();
+			ISiteFeatureReference[] crefs = csite.getSite().getFeatureReferences();
 			for (int j = 0; j < crefs.length; j++) {
 				IFeatureReference cref = crefs[j];
 				IFeature cfeature = null;
@@ -1081,68 +992,64 @@
 			//feature is root - can be configured
 		}
 	}
-//
-//	/**
-//	 * Checks if the configuration is locked by other instances
-//	 * 
-//	 * @param status
-//	 */
-//	private static void checkConfigurationLock(ArrayList status) {
-//		IPlatformConfiguration config =
-//			BootLoader.getCurrentPlatformConfiguration();
-//		URL configURL = config.getConfigurationLocation();
-//		if (!"file".equals(configURL.getProtocol())) {
-//			status.add(
-//				createStatus(
-//					null,
-//					"Configuration location is not writable:" + configURL));
-//			return;
-//		}
-//		String locationString = configURL.getFile();
-//		File configDir = new File(locationString);
-//		if (!configDir.isDirectory())
-//			configDir = configDir.getParentFile();
-//		if (!configDir.exists()) {
-//			status.add(
-//				createStatus(null, "Configuration location does not exist"));
-//			return;
-//		}
-//		File locksDir = new File(configDir, "locks");
-//		// check all the possible lock files
-//		File[] lockFiles = locksDir.listFiles();
-//		File configLock = BootLoader.getCurrentPlatformConfiguration().getLockFile();
-//		for (int i = 0; i < lockFiles.length; i++) {
-//			if (lockFiles[i].equals(configLock))
-//				continue;
-//			try {
-//				RandomAccessFile raf = new RandomAccessFile(lockFiles[i], "rw");
-//				FileChannel channel = raf.getChannel();
-//				System.out.println(channel.isOpen());
-//				FileLock lock = channel.tryLock();
-//				if (lock == null){
-//					// there is another eclipse instance running
-//					raf.close();
-//					status.add(
-//						createStatus(
-//							null,
-//							"Another instance is running, please close it before performing any configuration operations"));
-//					return;
-//				}
-//
-//			} catch (Exception e) {
-//				status.add(createStatus(null, "Failed to create lock:"+lockFiles[i]));
-//				return;
-//			} 
-//		}
-//	}
 
-	private static boolean isParent(
-		IFeature candidate,
-		IFeature feature,
-		boolean optionalOnly)
-		throws CoreException {
-		IIncludedFeatureReference[] refs =
-			candidate.getIncludedFeatureReferences();
+	//
+	//	/**
+	//	 * Checks if the configuration is locked by other instances
+	//	 * 
+	//	 * @param status
+	//	 */
+	//	private static void checkConfigurationLock(ArrayList status) {
+	//		IPlatformConfiguration config =
+	//			BootLoader.getCurrentPlatformConfiguration();
+	//		URL configURL = config.getConfigurationLocation();
+	//		if (!"file".equals(configURL.getProtocol())) {
+	//			status.add(
+	//				createStatus(
+	//					null,
+	//					"Configuration location is not writable:" + configURL));
+	//			return;
+	//		}
+	//		String locationString = configURL.getFile();
+	//		File configDir = new File(locationString);
+	//		if (!configDir.isDirectory())
+	//			configDir = configDir.getParentFile();
+	//		if (!configDir.exists()) {
+	//			status.add(
+	//				createStatus(null, "Configuration location does not exist"));
+	//			return;
+	//		}
+	//		File locksDir = new File(configDir, "locks");
+	//		// check all the possible lock files
+	//		File[] lockFiles = locksDir.listFiles();
+	//		File configLock = BootLoader.getCurrentPlatformConfiguration().getLockFile();
+	//		for (int i = 0; i < lockFiles.length; i++) {
+	//			if (lockFiles[i].equals(configLock))
+	//				continue;
+	//			try {
+	//				RandomAccessFile raf = new RandomAccessFile(lockFiles[i], "rw");
+	//				FileChannel channel = raf.getChannel();
+	//				System.out.println(channel.isOpen());
+	//				FileLock lock = channel.tryLock();
+	//				if (lock == null){
+	//					// there is another eclipse instance running
+	//					raf.close();
+	//					status.add(
+	//						createStatus(
+	//							null,
+	//							"Another instance is running, please close it before performing any configuration operations"));
+	//					return;
+	//				}
+	//
+	//			} catch (Exception e) {
+	//				status.add(createStatus(null, "Failed to create lock:"+lockFiles[i]));
+	//				return;
+	//			} 
+	//		}
+	//	}
+
+	private static boolean isParent(IFeature candidate, IFeature feature, boolean optionalOnly) throws CoreException {
+		IIncludedFeatureReference[] refs = candidate.getIncludedFeatureReferences();
 		for (int i = 0; i < refs.length; i++) {
 			IIncludedFeatureReference child = refs[i];
 			VersionedIdentifier fvid = feature.getVersionedIdentifier();
@@ -1163,39 +1070,30 @@
 		return false;
 	}
 
-//	private static boolean checkTimeline(
-//		IInstallConfiguration config,
-//		ArrayList status) {
-//		try {
-//			ILocalSite lsite = SiteManager.getLocalSite();
-//			IInstallConfiguration cconfig = lsite.getCurrentConfiguration();
-//			if (cconfig.getTimeline() != config.getTimeline()) {
-//				// Not the same timeline - cannot revert
-//				String msg =
-//					UpdateUtils.getFormattedMessage(
-//						KEY_WRONG_TIMELINE,
-//						config.getLabel());
-//				status.add(createStatus(null, FeatureStatus.CODE_OTHER, msg));
-//				return false;
-//			}
-//		} catch (CoreException e) {
-//			status.add(e.getStatus());
-//		}
-//		return true;
-//	}
+	//	private static boolean checkTimeline(
+	//		IInstallConfiguration config,
+	//		ArrayList status) {
+	//		try {
+	//			ILocalSite lsite = SiteManager.getLocalSite();
+	//			IInstallConfiguration cconfig = lsite.getCurrentConfiguration();
+	//			if (cconfig.getTimeline() != config.getTimeline()) {
+	//				// Not the same timeline - cannot revert
+	//				String msg =
+	//					UpdateUtils.getFormattedMessage(
+	//						KEY_WRONG_TIMELINE,
+	//						config.getLabel());
+	//				status.add(createStatus(null, FeatureStatus.CODE_OTHER, msg));
+	//				return false;
+	//			}
+	//		} catch (CoreException e) {
+	//			status.add(e.getStatus());
+	//		}
+	//		return true;
+	//	}
 
-	private static IStatus createMultiStatus(
-		String message,
-		ArrayList children,
-		int code) {
-		IStatus[] carray =
-			(IStatus[]) children.toArray(new IStatus[children.size()]);
-		return new MultiStatus(
-			UpdateCore.getPlugin().getBundle().getSymbolicName(),
-			code,
-			carray,
-			message,
-			null);
+	private static IStatus createMultiStatus(String message, ArrayList children, int code) {
+		IStatus[] carray = (IStatus[]) children.toArray(new IStatus[children.size()]);
+		return new MultiStatus(UpdateCore.getPlugin().getBundle().getSymbolicName(), code, carray, message, null);
 	}
 
 	private static IStatus createStatus(IFeature feature, int errorCode, String message) {
@@ -1204,22 +1102,11 @@
 		if (feature == null)
 			fullMessage = message;
 		else {
-			PluginVersionIdentifier version =
-				feature.getVersionedIdentifier().getVersion();
-			fullMessage =
-				NLS.bind(Messages.ActivityConstraints_childMessage, (new String[] {
-                feature.getLabel(),
-                version.toString(),
-                message }));
+			PluginVersionIdentifier version = feature.getVersionedIdentifier().getVersion();
+			fullMessage = NLS.bind(Messages.ActivityConstraints_childMessage, (new String[] {feature.getLabel(), version.toString(), message}));
 		}
 
-		return new FeatureStatus(
-			feature,
-			IStatus.ERROR,
-			UpdateCore.getPlugin().getBundle().getSymbolicName(),
-			errorCode,
-			fullMessage,
-			null);
+		return new FeatureStatus(feature, IStatus.ERROR, UpdateCore.getPlugin().getBundle().getSymbolicName(), errorCode, fullMessage, null);
 	}
 
 	//	private static IStatus createReportStatus(ArrayList beforeStatus,
@@ -1235,16 +1122,12 @@
 	//		return null;
 	//	}
 
-	private static IStatus createCombinedReportStatus(
-		ArrayList beforeStatus,
-		ArrayList status) {
+	private static IStatus createCombinedReportStatus(ArrayList beforeStatus, ArrayList status) {
 		if (beforeStatus.size() == 0) { // good initial config
 			if (status.size() == 0) {
 				return null; // all fine
 			} else {
-				return createMultiStatus(Messages.ActivityConstraints_rootMessage,
-					status,
-					IStatus.ERROR);
+				return createMultiStatus(Messages.ActivityConstraints_rootMessage, status, IStatus.ERROR);
 				// error after operation
 			}
 		} else { // beforeStatus.size() > 0 : initial config errors
@@ -1252,27 +1135,13 @@
 				return null; // errors will be fixed
 			} else {
 				if (isBetterStatus(beforeStatus, status)) {
-					return createMultiStatus(
-						Messages.ActivityConstraints_warning,
-						beforeStatus,
-						IStatus.WARNING);
+					return createMultiStatus(Messages.ActivityConstraints_warning, beforeStatus, IStatus.WARNING);
 					// errors may be fixed
 				} else {
 					ArrayList combined = new ArrayList();
-					combined.add(
-						createMultiStatus(
-							Messages.ActivityConstraints_beforeMessage,
-							beforeStatus,
-							IStatus.ERROR));
-					combined.add(
-						createMultiStatus(
-							Messages.ActivityConstraints_afterMessage,
-							status,
-							IStatus.ERROR));
-					return createMultiStatus(
-						Messages.ActivityConstraints_rootMessageInitial,
-						combined,
-						IStatus.ERROR);
+					combined.add(createMultiStatus(Messages.ActivityConstraints_beforeMessage, beforeStatus, IStatus.ERROR));
+					combined.add(createMultiStatus(Messages.ActivityConstraints_afterMessage, status, IStatus.ERROR));
+					return createMultiStatus(Messages.ActivityConstraints_rootMessageInitial, combined, IStatus.ERROR);
 				}
 			}
 		}
@@ -1281,8 +1150,7 @@
 	private static ArrayList createList(String commaSeparatedList) {
 		ArrayList list = new ArrayList();
 		if (commaSeparatedList != null) {
-			StringTokenizer t =
-				new StringTokenizer(commaSeparatedList.trim(), ","); //$NON-NLS-1$
+			StringTokenizer t = new StringTokenizer(commaSeparatedList.trim(), ","); //$NON-NLS-1$
 			while (t.hasMoreTokens()) {
 				String token = t.nextToken().trim();
 				if (!token.equals("")) //$NON-NLS-1$
@@ -1299,9 +1167,7 @@
 	 * @param status
 	 * @return
 	 */
-	private static boolean isBetterStatus(
-		ArrayList beforeStatus,
-		ArrayList status) {
+	private static boolean isBetterStatus(ArrayList beforeStatus, ArrayList status) {
 		// if no status at all, then it's a subset
 		if (status == null || status.size() == 0)
 			return true;
@@ -1332,42 +1198,45 @@
 		}
 		return true;
 	}
-	
+
 	public class RequiredFeaturesResult {
-		
+
 		private IStatus status;
 		private Set requiredFeatures;
-		
+
 		public Set getRequiredFeatures() {
 			return requiredFeatures;
 		}
+
 		public void setRequiredFeatures(Set requiredFeatures) {
 			this.requiredFeatures = requiredFeatures;
 		}
+
 		public void addRequiredFeatures(Set requiredFeatures) {
 			if (requiredFeatures == null) {
 				requiredFeatures = new HashSet();
 			}
 			this.requiredFeatures.addAll(requiredFeatures);
 		}
+
 		public IStatus getStatus() {
 			return status;
 		}
+
 		public void setStatus(IStatus status) {
 			this.status = status;
 		}
-		
-		
+
 	}
-	
+
 	public static class InternalImport {
-		
+
 		private IImport iimport;
 
 		public InternalImport(IImport iimport) {
 			this.iimport = iimport;
 		}
-		
+
 		public IImport getImport() {
 			return iimport;
 		}
@@ -1375,23 +1244,23 @@
 		public void setImport(IImport iimport) {
 			this.iimport = iimport;
 		}
-		
+
 		public boolean equals(Object object) {
 
-			if ( ( object == null) || !(object instanceof InternalImport))
+			if ((object == null) || !(object instanceof InternalImport))
 				return false;
-			
-			if ( object == this)
+
+			if (object == this)
 				return true;
-			
-			return iimport.getVersionedIdentifier().equals( ((InternalImport)object).getImport().getVersionedIdentifier()) && (getImport().getRule() == ((InternalImport)object).getImport().getRule());
+
+			return iimport.getVersionedIdentifier().equals(((InternalImport) object).getImport().getVersionedIdentifier()) && (getImport().getRule() == ((InternalImport) object).getImport().getRule());
 
 		}
 
 		public int hashCode() {
 			return iimport.getVersionedIdentifier().hashCode() * iimport.getRule();
 		}
-		
+
 	}
 
 }
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/verifier/PlanVerifier.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/verifier/PlanVerifier.java
new file mode 100644
index 0000000..8e381c6
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/verifier/PlanVerifier.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.verifier;
+
+import java.util.ArrayList;
+
+import org.eclipse.update.operations.IInstallFeatureOperation;
+
+/**
+ * Verifier is responsible for checking plan sanity
+ */
+public abstract class PlanVerifier {
+	/**
+	 * Verifies provisioning operation of Classic Updater. Checks if feature can
+	 * be installed in an updateable site. Checks if version of already
+	 * installed plug-in is planned to downgraded or if update is safe.
+	 */
+	public abstract void verify(IInstallFeatureOperation installOperation,
+			ArrayList currentFeatures, ArrayList featuresAfterOperation,
+			ArrayList status);
+
+}
\ No newline at end of file