diff --git a/src/xercesc/NLS/EN_US/XMLErrList_EN_US.Xml b/src/xercesc/NLS/EN_US/XMLErrList_EN_US.Xml
index 6c1ee9778f0727ae37d9f1ab3c32ab1fd5485895..2073e40420cfbb538beb7dc5319ced4590e2a62a 100644
--- a/src/xercesc/NLS/EN_US/XMLErrList_EN_US.Xml
+++ b/src/xercesc/NLS/EN_US/XMLErrList_EN_US.Xml
@@ -304,6 +304,7 @@
             <Message Id="PrefixXMLNotMatchXMLURI" Text="The prefix 'xml' cannot be bound to any namespace other than its usual namespace."/>
             <Message Id="XMLURINotMatchXMLPrefix" Text="The namespace for 'xml' cannot be bound to any prefix other than 'xml'."/>
             <Message Id="NoXMLNSAsElementPrefix" Text="Element '{0}' cannot have 'xmlns' as its prefix."/>
+            <Message Id="CT_SimpleTypeChildRequired" Text="Complex Type Definition Representation OK - 2.2: &lt;restriction&gt; must have a &lt;simpleType&gt; child."/>
         </FatalError>
     </MsgDomain>
     <MsgDomain Domain="http://apache.org/xml/messages/XMLValidity">
diff --git a/src/xercesc/framework/XMLErrorCodes.hpp b/src/xercesc/framework/XMLErrorCodes.hpp
index 8871ec541780048f4d75b61b6e8da6dcf7154df7..23d74e07358d2caeb9340aecd06101468bd6391e 100644
--- a/src/xercesc/framework/XMLErrorCodes.hpp
+++ b/src/xercesc/framework/XMLErrorCodes.hpp
@@ -4,6 +4,7 @@
 #define ERRHEADER_XMLErrs
 
 #include <xercesc/framework/XMLErrorReporter.hpp>
+#include <xercesc/util/XercesDefs.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -310,7 +311,8 @@ public :
       , PrefixXMLNotMatchXMLURI            = 295
       , XMLURINotMatchXMLPrefix            = 296
       , NoXMLNSAsElementPrefix             = 297
-      , F_HighBounds                       = 298
+      , CT_SimpleTypeChildRequired         = 298
+      , F_HighBounds                       = 299
     };
 
     static bool isFatal(const XMLErrs::Codes toCheck)
diff --git a/src/xercesc/util/MsgLoaders/InMemory/CppErrMsgs_EN_US.hpp b/src/xercesc/util/MsgLoaders/InMemory/CppErrMsgs_EN_US.hpp
index 13f51f791fc4552d8009e34e297ceae0020a2b2e..c9e7cb25b928836e99a1b38185b11151c30cc174 100644
--- a/src/xercesc/util/MsgLoaders/InMemory/CppErrMsgs_EN_US.hpp
+++ b/src/xercesc/util/MsgLoaders/InMemory/CppErrMsgs_EN_US.hpp
@@ -643,10 +643,13 @@ const XMLCh gXMLErrArray[][128] =
       0x002E,0x00 }
   , { 0x0045,0x006C,0x0065,0x006D,0x0065,0x006E,0x0074,0x0020,0x0027,0x007B,0x0030,0x007D,0x0027,0x0020,0x0063,0x0061,0x006E,0x006E,0x006F,0x0074,0x0020,0x0068,0x0061,0x0076,0x0065,0x0020,0x0027,0x0078,0x006D,0x006C,0x006E,0x0073,0x0027,0x0020,0x0061,
       0x0073,0x0020,0x0069,0x0074,0x0073,0x0020,0x0070,0x0072,0x0065,0x0066,0x0069,0x0078,0x002E,0x00 }
+  , { 0x0043,0x006F,0x006D,0x0070,0x006C,0x0065,0x0078,0x0020,0x0054,0x0079,0x0070,0x0065,0x0020,0x0044,0x0065,0x0066,0x0069,0x006E,0x0069,0x0074,0x0069,0x006F,0x006E,0x0020,0x0052,0x0065,0x0070,0x0072,0x0065,0x0073,0x0065,0x006E,0x0074,0x0061,0x0074,
+      0x0069,0x006F,0x006E,0x0020,0x004F,0x004B,0x0020,0x002D,0x0020,0x0032,0x002E,0x0032,0x003A,0x0020,0x003C,0x0072,0x0065,0x0073,0x0074,0x0072,0x0069,0x0063,0x0074,0x0069,0x006F,0x006E,0x003E,0x0020,0x006D,0x0075,0x0073,0x0074,0x0020,0x0068,0x0061,
+      0x0076,0x0065,0x0020,0x0061,0x0020,0x003C,0x0073,0x0069,0x006D,0x0070,0x006C,0x0065,0x0054,0x0079,0x0070,0x0065,0x003E,0x0020,0x0063,0x0068,0x0069,0x006C,0x0064,0x002E,0x00 }
   , { 0x0046,0x005F,0x0045,0x006E,0x0064,0x00 }
 
 };
-const unsigned int gXMLErrArraySize = 299;
+const unsigned int gXMLErrArraySize = 300;
 
 const XMLCh gXMLValidityArray[][128] = 
 {
diff --git a/src/xercesc/util/MsgLoaders/MsgCatalog/XMLMsgCat_EN_US.Msg b/src/xercesc/util/MsgLoaders/MsgCatalog/XMLMsgCat_EN_US.Msg
index a3832b951f9ca88c92ff80e6b388eb32023b8eb0..0c9fac27c4f28fe83b16cc260ee21501da0ae340 100644
--- a/src/xercesc/util/MsgLoaders/MsgCatalog/XMLMsgCat_EN_US.Msg
+++ b/src/xercesc/util/MsgLoaders/MsgCatalog/XMLMsgCat_EN_US.Msg
@@ -292,6 +292,7 @@ $set 1
 295  The prefix 'xml' cannot be bound to any namespace other than its usual namespace.
 296  The namespace for 'xml' cannot be bound to any prefix other than 'xml'.
 297  Element '{0}' cannot have 'xmlns' as its prefix.
+298  Complex Type Definition Representation OK - 2.2: <restriction> must have a <simpleType> child.
 
 
 $set 2
diff --git a/src/xercesc/util/Platforms/Win32/Version.rc b/src/xercesc/util/Platforms/Win32/Version.rc
index d477850b2351aa6cd9a682313f694ce385212411..9bae6850dc48e59a05f08adbb59dab7c4226a9a5 100644
--- a/src/xercesc/util/Platforms/Win32/Version.rc
+++ b/src/xercesc/util/Platforms/Win32/Version.rc
@@ -394,6 +394,7 @@ BEGIN
     295               L"\x0054\x0068\x0065\x0020\x0070\x0072\x0065\x0066\x0069\x0078\x0020\x0027\x0078\x006D\x006C\x0027\x0020\x0063\x0061\x006E\x006E\x006F\x0074\x0020\x0062\x0065\x0020\x0062\x006F\x0075\x006E\x0064\x0020\x0074\x006F\x0020\x0061\x006E\x0079\x0020\x006E\x0061\x006D\x0065\x0073\x0070\x0061\x0063\x0065\x0020\x006F\x0074\x0068\x0065\x0072\x0020\x0074\x0068\x0061\x006E\x0020\x0069\x0074\x0073\x0020\x0075\x0073\x0075\x0061\x006C\x0020\x006E\x0061\x006D\x0065\x0073\x0070\x0061\x0063\x0065\x002E\x00"
     296               L"\x0054\x0068\x0065\x0020\x006E\x0061\x006D\x0065\x0073\x0070\x0061\x0063\x0065\x0020\x0066\x006F\x0072\x0020\x0027\x0078\x006D\x006C\x0027\x0020\x0063\x0061\x006E\x006E\x006F\x0074\x0020\x0062\x0065\x0020\x0062\x006F\x0075\x006E\x0064\x0020\x0074\x006F\x0020\x0061\x006E\x0079\x0020\x0070\x0072\x0065\x0066\x0069\x0078\x0020\x006F\x0074\x0068\x0065\x0072\x0020\x0074\x0068\x0061\x006E\x0020\x0027\x0078\x006D\x006C\x0027\x002E\x00"
     297               L"\x0045\x006C\x0065\x006D\x0065\x006E\x0074\x0020\x0027\x007B\x0030\x007D\x0027\x0020\x0063\x0061\x006E\x006E\x006F\x0074\x0020\x0068\x0061\x0076\x0065\x0020\x0027\x0078\x006D\x006C\x006E\x0073\x0027\x0020\x0061\x0073\x0020\x0069\x0074\x0073\x0020\x0070\x0072\x0065\x0066\x0069\x0078\x002E\x00"
+    298               L"\x0043\x006F\x006D\x0070\x006C\x0065\x0078\x0020\x0054\x0079\x0070\x0065\x0020\x0044\x0065\x0066\x0069\x006E\x0069\x0074\x0069\x006F\x006E\x0020\x0052\x0065\x0070\x0072\x0065\x0073\x0065\x006E\x0074\x0061\x0074\x0069\x006F\x006E\x0020\x004F\x004B\x0020\x002D\x0020\x0032\x002E\x0032\x003A\x0020\x003C\x0072\x0065\x0073\x0074\x0072\x0069\x0063\x0074\x0069\x006F\x006E\x003E\x0020\x006D\x0075\x0073\x0074\x0020\x0068\x0061\x0076\x0065\x0020\x0061\x0020\x003C\x0073\x0069\x006D\x0070\x006C\x0065\x0054\x0079\x0070\x0065\x003E\x0020\x0063\x0068\x0069\x006C\x0064\x002E\x00"
 END
 STRINGTABLE DISCARDABLE
 BEGIN
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index 08b2400e9fddbe28d0975987b7e11ed98f84b535..e4860780a9bfb0d3d447d1fcd77b496c38e52b35 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -3197,12 +3197,23 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName,
     // check that the base isn't a complex type with complex content
     // and that derivation method is not included in 'final'
     ComplexTypeInfo* baseTypeInfo = typeInfo->getBaseComplexTypeInfo();
+    bool simpleTypeRequired = false;
 
     if (baseTypeInfo) {
 
         if (baseTypeInfo->getContentType() != SchemaElementDecl::Simple) {
-            reportSchemaError(simpleContent, XMLUni::fgXMLErrDomain, XMLErrs::InvalidSimpleContentBase, baseName);
-            throw TraverseSchema::InvalidComplexTypeInfo;
+
+            // Schema Errata: E1-27
+            if (typeInfo->getDerivedBy() == SchemaSymbols::RESTRICTION
+                && ((baseTypeInfo->getContentType() == SchemaElementDecl::Mixed_Simple
+                    || baseTypeInfo->getContentType() == SchemaElementDecl::Mixed_Complex)
+                    && emptiableParticle(baseTypeInfo->getContentSpec()))) {
+                simpleTypeRequired = true;
+            }
+            else {
+                reportSchemaError(simpleContent, XMLUni::fgXMLErrDomain, XMLErrs::InvalidSimpleContentBase, baseName);
+                throw TraverseSchema::InvalidComplexTypeInfo;
+            }
         }
 
         if ((baseTypeInfo->getFinalSet() & typeInfo->getDerivedBy()) != 0) {
@@ -3259,6 +3270,13 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName,
                     throw TraverseSchema::InvalidComplexTypeInfo;
                 }
             }
+            // Schema Errata E1-27
+            // Complex Type Definition Restriction OK: 2.2
+            else if (simpleTypeRequired) {
+
+                reportSchemaError(content, XMLUni::fgXMLErrDomain, XMLErrs::CT_SimpleTypeChildRequired);
+                throw TraverseSchema::InvalidComplexTypeInfo;
+            }
 
             // ---------------------------------------------------------------
             // Build up the facet info
@@ -3378,6 +3396,15 @@ void TraverseSchema::traverseSimpleContentDecl(const XMLCh* const typeName,
             }
         }
         else {
+
+            // Schema Errata E1-27
+            // Complex Type Definition Restriction OK: 2.2
+            if (simpleTypeRequired) {
+
+                reportSchemaError(content, XMLUni::fgXMLErrDomain, XMLErrs::CT_SimpleTypeChildRequired);
+                throw TraverseSchema::InvalidComplexTypeInfo;
+            }
+
             typeInfo->setDatatypeValidator(typeInfo->getBaseDatatypeValidator());
         }
     } // end RESTRICTION