     <?xml version="1.0" encoding="UTF-8"?>

     <schema targetNamespace="urn:ietf:params:xml:ns:epp-1.0"
             xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"
             xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
             xmlns="http://www.w3.org/2001/XMLSchema"
             elementFormDefault="qualified">

     <!--
     Import common element types.
     -->
       <import namespace="urn:ietf:params:xml:ns:eppcom-1.0"
               schemaLocation="eppcom-1.0.xsd"/>

       <annotation>
         <documentation>
           Extensible Provisioning Protocol v1.0 schema.
         </documentation>
       </annotation>

     <!--
     Every EPP XML instance must begin with this element.
     -->
       <element name="epp" type="epp:eppType"/>

     <!--
     An EPP XML instance must contain a greeting, hello, command,
     response, or extension.
     -->
       <complexType name="eppType">
         <choice>
           <element name="greeting" type="epp:greetingType"/>
           <element name="hello"/>
           <element name="command" type="epp:commandType"/>
           <element name="response" type="epp:responseType"/>
           <element name="extension" type="epp:extAnyType"/>
         </choice>
       </complexType>

     <!--
     A greeting is sent by a server in response to a client connection
     or <hello>.
     -->
       <complexType name="greetingType">
         <sequence>
           <element name="svID" type="epp:sIDType"/>
           <element name="svDate" type="dateTime"/>
           <element name="svcMenu" type="epp:svcMenuType"/>
           <element name="dcp" type="epp:dcpType"/>
         </sequence>
       </complexType>

     <!--
     Server IDs are strings with minimum and maximum length
     restrictions.
     -->
       <simpleType name="sIDType">
         <restriction base="normalizedString">
           <minLength value="3"/>
           <maxLength value="64"/>
         </restriction>
       </simpleType>

     <!--
     A server greeting identifies available object services.
     -->
       <complexType name="svcMenuType">
         <sequence>
           <element name="version" type="epp:versionType"
            maxOccurs="unbounded"/>
           <element name="lang" type="language"
            maxOccurs="unbounded"/>
           <element name="objURI" type="anyURI"
            maxOccurs="unbounded"/>
           <element name="svcExtension" type="epp:extURIType"
            minOccurs="0"/>
         </sequence>
       </complexType>

     <!--
     Data Collection Policy types.
     -->
       <complexType name="dcpType">
         <sequence>
           <element name="access" type="epp:dcpAccessType"/>
           <element name="statement" type="epp:dcpStatementType"
            maxOccurs="unbounded"/>
           <element name="expiry" type="epp:dcpExpiryType"
            minOccurs="0"/>
         </sequence>
       </complexType>

       <complexType name="dcpAccessType">
         <choice>
           <element name="all"/>
           <element name="none"/>
           <element name="null"/>
           <element name="other"/>
           <element name="personal"/>
           <element name="personalAndOther"/>
         </choice>
       </complexType>

       <complexType name="dcpStatementType">
         <sequence>
           <element name="purpose" type="epp:dcpPurposeType"/>
           <element name="recipient" type="epp:dcpRecipientType"/>
           <element name="retention" type="epp:dcpRetentionType"/>
         </sequence>
       </complexType>

       <complexType name="dcpPurposeType">
         <sequence>
           <element name="admin"
            minOccurs="0"/>
           <element name="contact"
            minOccurs="0"/>
           <element name="other"
            minOccurs="0"/>
           <element name="prov"
            minOccurs="0"/>
         </sequence>
       </complexType>

       <complexType name="dcpRecipientType">
         <sequence>
           <element name="other"
            minOccurs="0"/>
           <element name="ours" type="epp:dcpOursType"
            minOccurs="0" maxOccurs="unbounded"/>
           <element name="public"
            minOccurs="0"/>
           <element name="same"
            minOccurs="0"/>
           <element name="unrelated"
            minOccurs="0"/>
         </sequence>
       </complexType>

       <complexType name="dcpOursType">
         <sequence>
           <element name="recDesc" type="epp:dcpRecDescType"
            minOccurs="0"/>
         </sequence>
       </complexType>

       <simpleType name="dcpRecDescType">
         <restriction base="token">
           <minLength value="1"/>
           <maxLength value="255"/>
         </restriction>
       </simpleType>

       <complexType name="dcpRetentionType">
         <choice>
           <element name="business"/>
           <element name="indefinite"/>
           <element name="legal"/>
           <element name="none"/>
           <element name="stated"/>
         </choice>
       </complexType>

       <complexType name="dcpExpiryType">
         <choice>
           <element name="absolute" type="dateTime"/>
           <element name="relative" type="duration"/>
         </choice>
       </complexType>

     <!--
     Extension framework types.
     -->
       <complexType name="extAnyType">
         <sequence>
           <any namespace="##other"
            maxOccurs="unbounded"/>
         </sequence>
       </complexType>

       <complexType name="extURIType">
         <sequence>
           <element name="extURI" type="anyURI"
            maxOccurs="unbounded"/>
         </sequence>
       </complexType>

     <!--
   An EPP version number is a dotted pair of decimal numbers.
   -->
     <simpleType name="versionType">
       <restriction base="token">
         <pattern value="[1-9]+\.[0-9]+"/>
         <enumeration value="1.0"/>
       </restriction>
     </simpleType>

   <!--
   Command types.
   -->
     <complexType name="commandType">
       <sequence>
         <choice>
           <element name="check" type="epp:readWriteType"/>
           <element name="create" type="epp:readWriteType"/>
           <element name="delete" type="epp:readWriteType"/>
           <element name="info" type="epp:readWriteType"/>
           <element name="login" type="epp:loginType"/>
           <element name="logout"/>
           <element name="poll" type="epp:pollType"/>
           <element name="renew" type="epp:readWriteType"/>
           <element name="transfer" type="epp:transferType"/>
           <element name="update" type="epp:readWriteType"/>
         </choice>
         <element name="extension" type="epp:extAnyType"
          minOccurs="0"/>
         <element name="clTRID" type="epp:trIDStringType"
          minOccurs="0"/>
       </sequence>
     </complexType>

   <!--
   The <login> command.
   -->
     <complexType name="loginType">
       <sequence>
         <element name="clID" type="eppcom:clIDType"/>
         <element name="pw" type="epp:pwType"/>
         <element name="newPW" type="epp:pwType"
          minOccurs="0"/>
         <element name="options" type="epp:credsOptionsType"/>
         <element name="svcs" type="epp:loginSvcType"/>
       </sequence>
     </complexType>

     <complexType name="credsOptionsType">
       <sequence>
         <element name="version" type="epp:versionType"/>
         <element name="lang" type="language"/>
       </sequence>
     </complexType>

     <simpleType name="pwType">
       <restriction base="token">
         <minLength value="6"/>
         <maxLength value="16"/>
       </restriction>
     </simpleType>

     <complexType name="loginSvcType">
       <sequence>
         <element name="objURI" type="anyURI"
          maxOccurs="unbounded"/>
         <element name="svcExtension" type="epp:extURIType"
          minOccurs="0"/>
       </sequence>
     </complexType>

   <!--
   The <poll> command.
   -->
     <complexType name="pollType">
       <attribute name="op" type="epp:pollOpType"
        use="required"/>
       <attribute name="msgID" type="token"/>
     </complexType>

     <simpleType name="pollOpType">
       <restriction base="token">
         <enumeration value="ack"/>
         <enumeration value="req"/>
       </restriction>
     </simpleType>
   <!--
   The <transfer> command.  This is object-specific, and uses attributes
   to identify the requested operation.
   -->
     <complexType name="transferType">
       <sequence>
         <any namespace="##other"/>
       </sequence>
       <attribute name="op" type="epp:transferOpType"
        use="required"/>
     </complexType>
     <simpleType name="transferOpType">
       <restriction base="token">
         <enumeration value="approve"/>
         <enumeration value="cancel"/>
         <enumeration value="query"/>
         <enumeration value="reject"/>
         <enumeration value="request"/>
       </restriction>
     </simpleType>

   <!--
   All other object-centric commands. EPP doesn't specify the syntax or
   semantics of object-centric command elements.  The elements MUST be
   described in detail in another schema specific to the object.
   -->
     <complexType name="readWriteType">
       <sequence>
         <any namespace="##other"/>
       </sequence>
     </complexType>

     <complexType name="trIDType">
       <sequence>
         <element name="clTRID" type="epp:trIDStringType"
          minOccurs="0"/>
         <element name="svTRID" type="epp:trIDStringType"/>
       </sequence>
     </complexType>

     <simpleType name="trIDStringType">
       <restriction base="token">
         <minLength value="3"/>
         <maxLength value="64"/>
       </restriction>
     </simpleType>
   <!--
   Response types.
   -->
     <complexType name="responseType">
       <sequence>
         <element name="result" type="epp:resultType"
          maxOccurs="unbounded"/>
         <element name="msgQ" type="epp:msgQType"
          minOccurs="0"/>
         <element name="resData" type="epp:extAnyType"
          minOccurs="0"/>
         <element name="extension" type="epp:extAnyType"
          minOccurs="0"/>
         <element name="trID" type="epp:trIDType"/>
       </sequence>
     </complexType>

     <complexType name="resultType">
       <sequence>
         <element name="msg" type="epp:msgType"/>
         <choice minOccurs="0" maxOccurs="unbounded">
           <element name="value" type="epp:errValueType"/>
           <element name="extValue" type="epp:extErrValueType"/>
         </choice>
       </sequence>
       <attribute name="code" type="epp:resultCodeType"
        use="required"/>
     </complexType>

     <complexType name="errValueType" mixed="true">
       <sequence>
         <any namespace="##any" processContents="skip"/>
       </sequence>
       <anyAttribute namespace="##any" processContents="skip"/>
     </complexType>

     <complexType name="extErrValueType">
       <sequence>
         <element name="value" type="epp:errValueType"/>
         <element name="reason" type="epp:msgType"/>
       </sequence>
     </complexType>

     <complexType name="msgQType">
       <sequence>
         <element name="qDate" type="dateTime"
          minOccurs="0"/>
         <element name="msg" type="epp:mixedMsgType"
          minOccurs="0"/>
       </sequence>
       <attribute name="count" type="unsignedLong"
        use="required"/>
       <attribute name="id" type="eppcom:minTokenType"
        use="required"/>
     </complexType>

     <complexType name="mixedMsgType" mixed="true">
       <sequence>
         <any processContents="skip"
          minOccurs="0" maxOccurs="unbounded"/>
       </sequence>
       <attribute name="lang" type="language"
        default="en"/>
     </complexType>

   <!--
   Human-readable text may be expressed in languages other than English.
   -->
     <complexType name="msgType">
       <simpleContent>
         <extension base="normalizedString">
           <attribute name="lang" type="language"
            default="en"/>
         </extension>
       </simpleContent>
     </complexType>

   <!--
   EPP result codes.
   -->
     <simpleType name="resultCodeType">
       <restriction base="unsignedShort">
         <enumeration value="1000"/>
         <enumeration value="1001"/>
         <enumeration value="1300"/>
         <enumeration value="1301"/>
         <enumeration value="1500"/>
         <enumeration value="2000"/>
         <enumeration value="2001"/>
         <enumeration value="2002"/>
         <enumeration value="2003"/>
         <enumeration value="2004"/>
         <enumeration value="2005"/>
         <enumeration value="2100"/>
         <enumeration value="2101"/>
         <enumeration value="2102"/>
         <enumeration value="2103"/>
         <enumeration value="2104"/>
         <enumeration value="2105"/>
         <enumeration value="2106"/>
         <enumeration value="2200"/>
         <enumeration value="2201"/>
         <enumeration value="2202"/>
         <enumeration value="2300"/>
         <enumeration value="2301"/>
         <enumeration value="2302"/>
         <enumeration value="2303"/>
         <enumeration value="2304"/>
         <enumeration value="2305"/>
         <enumeration value="2306"/>
         <enumeration value="2307"/>
         <enumeration value="2308"/>
         <enumeration value="2400"/>
         <enumeration value="2500"/>
         <enumeration value="2501"/>
         <enumeration value="2502"/>
       </restriction>
     </simpleType>

   <!--
   End of schema.
   -->
   </schema>
