diff --git a/src/xercesc/validators/schema/identity/ValueStore.cpp b/src/xercesc/validators/schema/identity/ValueStore.cpp
index 5fe05f64b3d7f3671f5552cefc540c03e9145690..f2fbe837753a12fe6abc8f4874372286d2c37fcd 100644
--- a/src/xercesc/validators/schema/identity/ValueStore.cpp
+++ b/src/xercesc/validators/schema/identity/ValueStore.cpp
@@ -219,27 +219,15 @@ bool ValueStore::isDuplicateOf(DatatypeValidator* const dv1, const XMLCh* const
         return false;
     }
 
-    // are the validators equal?
-    // As always we are obliged to compare by reference...
-    if (dv1 == dv2  || 
-        ((dv1->getType()==DatatypeValidator::ID || dv1->getType()==DatatypeValidator::IDREF) && 
-         (dv2->getType()==DatatypeValidator::ID || dv2->getType()==DatatypeValidator::IDREF))) {
-        return ((dv1->compare(val1, val2, fMemoryManager)) == 0);
-    }
-
-    // see if this.fValidator is derived from value.fValidator:
-    DatatypeValidator* tempVal = dv1;
-    for(; tempVal != NULL && tempVal != dv2; tempVal = tempVal->getBaseValidator()) ;
-
-    if (tempVal) { // was derived!
-        return ((dv2->compare(val1, val2, fMemoryManager)) == 0);
-    }
-
-    // see if value.fValidator is derived from this.fValidator:
-    for(tempVal = dv2; tempVal != NULL && tempVal != dv1; tempVal = tempVal->getBaseValidator()) ;
-
-    if(tempVal) { // was derived!
-        return ((dv1->compare(val1, val2, fMemoryManager)) == 0);
+    // find the common ancestor, if there is one
+    DatatypeValidator* tempVal1 = dv1;
+    while(tempVal1)
+    {
+        DatatypeValidator* tempVal2 = dv2;
+        for(; tempVal2 != NULL && tempVal2 != tempVal1; tempVal2 = tempVal2->getBaseValidator()) ;
+        if (tempVal2) 
+            return ((tempVal2->compare(val1, val2, fMemoryManager)) == 0);
+        tempVal1=tempVal1->getBaseValidator();
     }
 
     // if we're here it means the types weren't related. They are different: