FIXED - bug 332504: [DataBinding] [JFace Validators] Stack overflow
when using MultiValidator 
https://bugs.eclipse.org/bugs/show_bug.cgi?id=332504
diff --git a/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
index 7eb6a40..3730552 100644
--- a/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.core.databinding
-Bundle-Version: 1.4.0.qualifier
+Bundle-Version: 1.4.1.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
index 2a5ca85..6364e02 100644
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
+++ b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
@@ -8,8 +8,9 @@
  * Contributors:
  *     Matthew Hall - initial API and implementation (bug 218269)
  *     Boris Bokowski - bug 218269
- *     Matthew Hall - bug 237884, 240590, 251003, 251424, 278550
+ *     Matthew Hall - bug 237884, 240590, 251003, 251424, 278550, 332504
  *     Ovidio Mallo - bug 238909, 235859
+ *     Stefan R�ck - bug 332504 
  ******************************************************************************/
 
 package org.eclipse.core.databinding.validation;
@@ -209,7 +210,6 @@
 	 */
 	public IObservableValue getValidationStatus() {
 		if (unmodifiableValidationStatus == null) {
-			revalidate();
 			ObservableTracker.setIgnore(true);
 			try {
 				unmodifiableValidationStatus = Observables
@@ -217,6 +217,7 @@
 			} finally {
 				ObservableTracker.setIgnore(false);
 			}
+			revalidate();
 		}
 		return unmodifiableValidationStatus;
 	}
@@ -263,6 +264,19 @@
 		try {
 			List newTargets = new ArrayList(Arrays.asList(dependencies));
 
+			// Internal observables should not be dependencies
+			// (prevent dependency loop)
+			for (Iterator itNew = newTargets.iterator(); itNew.hasNext();) {
+				Object newDependency = itNew.next();
+				if (newDependency == validationStatus
+						|| newDependency == unmodifiableValidationStatus
+						|| newDependency == targets
+						|| newDependency == unmodifiableTargets
+						|| newDependency == models) {
+					itNew.remove();
+				}
+			}
+
 			// This loop is roughly equivalent to:
 			// targets.retainAll(newTargets);
 			// newTargets.removeAll(targets);
@@ -277,14 +291,6 @@
 						// new dependencies
 						itNew.remove();
 						continue outer;
-					} else if (newDependency == validationStatus
-							|| newDependency == unmodifiableValidationStatus
-							|| newDependency == targets
-							|| newDependency == unmodifiableTargets
-							|| newDependency == models) {
-						// Internal observables should not be dependencies
-						// (prevent dependency loop)
-						itNew.remove();
 					}
 				}
 				// Old dependency is no longer a dependency--remove from
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
index 4506a57..93a84ad 100644
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
+++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     Matthew Hall - initial API and implementation (bug 218269)
- *     Matthew Hall - bug 237884, 251003
+ *     Matthew Hall - bugs 237884, 251003, 332504
  *     Ovidio Mallo - bugs 240590, 238909, 251003, 247741, 235859
  ******************************************************************************/
 
@@ -391,6 +391,30 @@
 		assertTrue(validator.getTargets().contains(emptyListDependency));
 	}
 
+	public void testBug357568_MultiValidatorTargetAsDependency() {
+		validator = new MultiValidator() {
+			protected IStatus validate() {
+				ObservableTracker.getterCalled(dependency);
+				ObservableTracker.getterCalled(new DependencyObservable());
+				ObservableTracker.getterCalled(validator.getTargets());
+				return null;
+			}
+		};
+
+		validator.getValidationStatus().getValue();
+		dependency.setValue(ValidationStatus.info("foo"));
+	}
+
+	public void testBug357568_ValidationStatusAsDependency() {
+		validator = new MultiValidator() {
+			protected IStatus validate() {
+				return (IStatus) validator.getValidationStatus().getValue();
+			}
+		};
+
+		validator.getValidationStatus();
+	}
+
 	private static class DependencyObservableValue extends WritableValue {
 		private boolean stale = false;