diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp
index c06000dd45b0002a627abeba84aec48d9b634810..20f40316342da302202b63e5302d386043171c0e 100644
--- a/src/xercesc/validators/schema/SchemaValidator.cpp
+++ b/src/xercesc/validators/schema/SchemaValidator.cpp
@@ -630,14 +630,21 @@ void SchemaValidator::validateElement(const   XMLElementDecl*  elemDef)
                                     fErrorOccurred = true;
                                 }
                                 else if(elemTypeInfo != typeInfo) {
-                                    int derivationMethod = typeInfo->getDerivedBy();
-                                    if ((((SchemaElementDecl*)elemDef)->getBlockSet() & derivationMethod) != 0) {
-                                        emitError(XMLValid::ElemNoSubforBlock, elemDef->getFullName());
-                                        fErrorOccurred = true;
-                                    }
-                                    if ((tempType->getBlockSet() & derivationMethod) != 0) {
-                                        emitError(XMLValid::TypeNoSubforBlock, tempType->getTypeName());
-                                        fErrorOccurred = true;
+                                    // perform the check on the entire inheritance chain
+                                    ComplexTypeInfo* tempType = typeInfo;
+                                    while (tempType) {
+                                        if (tempType == elemTypeInfo)
+                                            break;
+                                        int derivationMethod = tempType->getDerivedBy();
+                                        if ((((SchemaElementDecl*)elemDef)->getBlockSet() & derivationMethod) != 0) {
+                                            emitError(XMLValid::ElemNoSubforBlock, elemDef->getFullName());
+                                            fErrorOccurred = true;
+                                        }
+                                        if ((elemTypeInfo->getBlockSet() & derivationMethod) != 0) {
+                                            emitError(XMLValid::TypeNoSubforBlock, elemTypeInfo->getTypeName());
+                                            fErrorOccurred = true;
+                                        }
+                                        tempType = tempType->getBaseComplexTypeInfo();
                                     }
                                 }
                             }