diff --git a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/IValidatorChangedListener.java b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/IValidatorChangedListener.java
index 48694b6..3902290 100644
--- a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/IValidatorChangedListener.java
+++ b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/IValidatorChangedListener.java
@@ -11,9 +11,11 @@
 package org.eclipse.dltk.validators.core;
 
 public interface IValidatorChangedListener {
-	public void validatorChanged(IValidator validator);
+	// public void validatorChanged(IValidator validator);
 
-	public void validatorAdded(IValidator validator);
+	// public void validatorAdded(IValidator validator);
 
-	public void validatorRemoved(IValidator validator);
+	// public void validatorRemoved(IValidator validator);
+
+	void validatorChanged();
 }
diff --git a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/ValidatorRuntime.java b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/ValidatorRuntime.java
index 8b06418..8090436 100644
--- a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/ValidatorRuntime.java
+++ b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/ValidatorRuntime.java
@@ -157,15 +157,13 @@
 	/**
 	 * Perform Interpreter type and Interpreter install initialization. Does not
 	 * hold locks while performing change notification.
-	 * 
-	 * 
 	 */
 	private static void initializeValidators() {
 		ValidatorDefinitionsContainer validatorDefs = null;
 		boolean setPref = false;
 		synchronized (fgValidatorLock) {
 			if (isInitialized) {
-				// return;
+				return;
 			}
 			isInitialized = true;
 			try {
@@ -196,16 +194,18 @@
 			} catch (CoreException e1) {
 				return;
 			}
-			for (int i = 0; i < validatorTypes.length; i++) {
-				final IValidatorType type = validatorTypes[i];
-				final IValidator[] validators = type.getValidators();
-				if (validators != null) {
-					for (int j = 0; j < validators.length; j++) {
-						final IValidator validator = validators[j];
-						if (type.findValidator(validator.getID()) == null) {
-							type.addValidator(validator);
+			// register loaded validators with corresponding types
+			for (Iterator i = validatorDefs.getValidatorList().iterator(); i
+					.hasNext();) {
+				final IValidator validator = (IValidator) i.next();
+				final String typeId = validator.getValidatorType().getID();
+				for (int j = 0; j < validatorTypes.length; ++j) {
+					final IValidatorType validatorType = validatorTypes[j];
+					if (typeId.equals(validatorType.getID())) {
+						if (validatorType.findValidator(validator.getID()) == null) {
+							validatorType.addValidator(validator);
 						}
-						fireValidatorAdded(validator);
+						break;
 					}
 				}
 			}
@@ -241,8 +241,9 @@
 	public static void fireValidatorChanged(IValidator validator) {
 		Object[] listeners = fgValidatorListeners.getListeners();
 		for (int i = 0; i < listeners.length; i++) {
-			IValidatorChangedListener listener = (IValidatorChangedListener) listeners[i];
-			listener.validatorChanged(validator);
+			// IValidatorChangedListener listener = (IValidatorChangedListener)
+			// listeners[i];
+			// listener.validatorChanged(validator);
 		}
 	}
 
@@ -250,8 +251,9 @@
 		if (!fgInitializingValidators) {
 			Object[] listeners = fgValidatorListeners.getListeners();
 			for (int i = 0; i < listeners.length; i++) {
-				IValidatorChangedListener listener = (IValidatorChangedListener) listeners[i];
-				listener.validatorAdded(Interpreter);
+				// IValidatorChangedListener listener =
+				// (IValidatorChangedListener) listeners[i];
+				// listener.validatorAdded(Interpreter);
 			}
 		}
 	}
@@ -259,8 +261,9 @@
 	public static void fireValidatorRemoved(IValidator Interpreter) {
 		Object[] listeners = fgValidatorListeners.getListeners();
 		for (int i = 0; i < listeners.length; i++) {
-			IValidatorChangedListener listener = (IValidatorChangedListener) listeners[i];
-			listener.validatorRemoved(Interpreter);
+			// IValidatorChangedListener listener = (IValidatorChangedListener)
+			// listeners[i];
+			// listener.validatorRemoved(Interpreter);
 		}
 	}
 
@@ -492,4 +495,15 @@
 		}
 	}
 
+	public static void fireValidatorChanged() {
+		synchronized (fgValidatorLock) {
+			isInitialized = false;
+		}
+		Object[] listeners = fgValidatorListeners.getListeners();
+		for (int i = 0; i < listeners.length; i++) {
+			IValidatorChangedListener listener = (IValidatorChangedListener) listeners[i];
+			listener.validatorChanged();
+		}
+	}
+
 }
diff --git a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/internal/core/ValidatorsCore.java b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/internal/core/ValidatorsCore.java
index 6d5e305..a40a464 100644
--- a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/internal/core/ValidatorsCore.java
+++ b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/internal/core/ValidatorsCore.java
@@ -49,12 +49,6 @@
 
 	private boolean fIgnoreValidatorDefPropertyChangeEvents = false;
 
-	// private boolean fBatchingChanges;
-
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
-	private String fOldInterpreterPrefString = EMPTY_STRING;
-
 	/**
 	 * The constructor
 	 */
@@ -81,6 +75,7 @@
 	 * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
 	 */
 	public void stop(BundleContext context) throws Exception {
+		getPluginPreferences().removePropertyChangeListener(this);
 		plugin = null;
 		super.stop(context);
 	}
@@ -143,7 +138,7 @@
 	}
 
 	private ValidatorDefinitionsContainer getValidatorDefinitions(String xml) {
-		if (xml.length() > 0) {
+		if (xml != null && xml.length() > 0) {
 			try {
 				return ValidatorDefinitionsContainer
 						.createFromXML(new StringReader(xml));
@@ -157,68 +152,32 @@
 	}
 
 	protected void processValidatorPrefsChanged(String oldValue, String newValue) {
-
-		// batch changes
-		// fBatchingChanges = true;
-		try {
-
-			String oldPrefString;
-			String newPrefString;
-
-			// If empty new value, save the old value and wait for 2nd
-			// propertyChange notification
-			if (newValue == null || newValue.equals(EMPTY_STRING)) {
-				fOldInterpreterPrefString = oldValue;
-				return;
-			}
-			// An empty old value signals the second notification in the import
-			// preferences
-			// sequence. Now that we have both old & new prefs, we can parse and
-			// compare them.
-			else if (oldValue == null || oldValue.equals(EMPTY_STRING)) {
-				oldPrefString = fOldInterpreterPrefString;
-				newPrefString = newValue;
-			}
-			// If both old & new values are present, this is a normal user
-			// change
-			else {
-				oldPrefString = oldValue;
-				newPrefString = newValue;
-			}
-
-			// Generate the previous Validators
-			ValidatorDefinitionsContainer oldResults = getValidatorDefinitions(oldPrefString);
-
-			// Generate the current
-			ValidatorDefinitionsContainer newResults = getValidatorDefinitions(newPrefString);
-
-			// Determine the deleted validators
-			List deleted = new ArrayList(oldResults.getValidatorList());
-			deleted.removeAll(newResults.getValidatorList());
-
-			// Dispose deleted Validators. The 'disposeInterpreterInstall'
-			// method fires notification of the
-			// deletion.
-			Iterator deletedIterator = deleted.iterator();
-			while (deletedIterator.hasNext()) {
-				IValidator deletedValidatorStandin = (IValidator) deletedIterator
-						.next();
-				deletedValidatorStandin.getValidatorType().disposeValidator(
-						deletedValidatorStandin.getID());
-			}
-
-			// Iterator currentIterator = current.iterator();
-			//			
-			// while(currentIterator.hasNext()){
-			// IValidator currentValidatorStandin = (IValidator)
-			// currentIterator.next();
-			// currentValidatorStandin.getValidatorType().createValidator(
-			// currentValidatorStandin.getID());
-			// }
-		} finally {
-			// stop batch changes
-			// fBatchingChanges = false;
+		if (oldValue == null && newValue == null) {
+			return;
 		}
+		if (oldValue != null && oldValue.equals(newValue)) {
+			return;
+		}
+
+		// Generate the previous Validators
+		ValidatorDefinitionsContainer oldResults = getValidatorDefinitions(oldValue);
+
+		// Generate the current
+		ValidatorDefinitionsContainer newResults = getValidatorDefinitions(newValue);
+
+		// Determine the deleted validators
+		List deleted = new ArrayList(oldResults.getValidatorList());
+		deleted.removeAll(newResults.getValidatorList());
+
+		// Dispose ALL but built-in validators
+		for (Iterator i = deleted.iterator(); i.hasNext();) {
+			IValidator validator = (IValidator) i.next();
+			validator.getValidatorType().disposeValidator(validator.getID());
+		}
+
+		// fire event and reset initialized flag - during next call new
+		// validators would be loaded and added to the validatorType
+		ValidatorRuntime.fireValidatorChanged();
 	}
 
 	public static void log(IStatus status) {
