<?xml version="1.0" encoding="UTF-8"?>
<!--
  Device:2 Root Data Model definition [USP]

  Copyright (c) 2010-2025, Broadband Forum

  The undersigned members have elected to grant the copyright to
  their contributed material used in this software:
    Copyright (c) 2017-2019, 2021 ARRIS Enterprises, LLC.

  Redistribution and use in source and binary forms, with or
  without modification, are permitted provided that the following
  conditions are met:

  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above
     copyright notice, this list of conditions and the following
     disclaimer in the documentation and/or other materials
     provided with the distribution.

  3. Neither the name of the copyright holder nor the names of its
     contributors may be used to endorse or promote products
     derived from this software without specific prior written
     permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  The above license is used as a license under copyright only.
  Please reference the Forum IPR Policy for patent licensing terms
  <https://www.broadband-forum.org/ipr-policy>.

  Any moral rights which are necessary to exercise under the above
  license grant are also deemed granted under this license.

  Comments or questions about this Broadband Forum data model should be
  directed to <info@broadband-forum.org>.
-->

<dm:document
    xmlns:dm="urn:broadband-forum-org:cwmp:datamodel-1-15"
    xmlns:dmr="urn:broadband-forum-org:cwmp:datamodel-report-1-0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      urn:broadband-forum-org:cwmp:datamodel-1-15
        https://www.broadband-forum.org/cwmp/cwmp-datamodel-1-15.xsd
      urn:broadband-forum-org:cwmp:datamodel-report-1-0
        https://www.broadband-forum.org/cwmp/cwmp-datamodel-report-1-0.xsd"
    spec="urn:broadband-forum-org:tr-181-2-19-0-usp"
    file="tr-181-2-19-0-usp.xml">
  <import file="tr-069-biblio.xml" spec="urn:broadband-forum-org:tr-069"/>

  <import file="tr-106-types.xml" spec="urn:broadband-forum-org:tr-106">
    <component name="Alias" ref="_AliasUSP"/>
    <dataType name="Alias" ref="_AliasUSP"/>
    <dataType name="IPAddress"/>
    <dataType name="JSONObject"/>
    <dataType name="MACAddress"/>
    <dataType name="StatsCounter32"/>
    <dataType name="StatsCounter64"/>
    <dataType name="URL"/>
    <dataType name="UUID"/>
  </import>


  <import file="tr-181-2-iot.xml"
      spec="urn:broadband-forum-org:tr-181-2-19-iot">
    <component name="IoT_NodeComponent"/>
    <component name="IoT_ProxiedDeviceExtensionComponent"/>
    <component name="IoT_ObjectComponent"/>
  </import>

  <import file="tr-181-2-gatewayinfo.xml"
      spec="urn:broadband-forum-org:tr-181-2-18-gatewayinfo">
    <component name="GatewayInfo"/>
  </import>

  <import file="tr-181-2-common.xml"
      spec="urn:broadband-forum-org:tr-181-2-19-common">
    <component name="ADSLLineDiagnosticsInput"/>
    <component name="ADSLLineDiagnosticsOutput"/>
    <component name="SELTUERDiagnosticsInput"/>
    <component name="SELTUERDiagnosticsOutput"/>
    <component name="SELTQLNDiagnosticsInput"/>
    <component name="SELTQLNDiagnosticsOutput"/>
    <component name="SELTPDiagnosticsInput"/>
    <component name="SELTPDiagnosticsOutput"/>
    <component name="ATMF5LoopbackDiagnosticsInput"/>
    <component name="ATMF5LoopbackDiagnosticsOutput"/>
    <component name="HPNAPHYThroughputDiagnosticsInput"/>
    <component name="HPNAPHYThroughputDiagnosticsOutput"/>
    <component name="HPNAPerformanceMonitoringDiagnosticsInput"/>
    <component name="HPNAPerformanceMonitoringDiagnosticsOutput"/>
    <component name="GhnPHYThroughputDiagnosticsInput"/>
    <component name="GhnPHYThroughputDiagnosticsOutput"/>
    <component name="GhnPerformanceMonitoringDiagnosticsInput"/>
    <component name="GhnPerformanceMonitoringDiagnosticsOutput"/>
    <component name="UPAInterfaceMeasurementDiagnosticsInput"/>
    <component name="UPAInterfaceMeasurementDiagnosticsOutput"/>
    <component name="IPPingDiagnosticsInput"/>
    <component name="IPPingDiagnosticsOutput"/>
    <component name="IPTraceRouteDiagnosticsInput"/>
    <component name="IPTraceRouteDiagnosticsOutput"/>
    <component name="IPDownloadDiagnosticsCapabilities"/>
    <component name="IPDownloadDiagnosticsInput"/>
    <component name="IPDownloadDiagnosticsInput2"/>
    <component name="IPDownloadDiagnosticsOutput"/>
    <component name="IPUploadDiagnosticsCapabilities"/>
    <component name="IPUploadDiagnosticsInput"/>
    <component name="IPUploadDiagnosticsInput2"/>
    <component name="IPUploadDiagnosticsOutput"/>
    <component name="IPUDPEchoDiagnosticsInput"/>
    <component name="IPUDPEchoDiagnosticsCapabilities"/>
    <component name="IPUDPEchoDiagnosticsInput2"/>
    <component name="IPUDPEchoDiagnosticsOutput"/>
    <component name="IPLayerCapacityCapabilities"/>
    <component name="IPLayerCapacityInput"/>
    <component name="IPLayerCapacityOutput"/>
    <component name="IPServerSelectionDiagnosticsInput"/>
    <component name="IPServerSelectionDiagnosticsOutput"/>
    <component name="DNSLookupDiagnosticsInput"/>
    <component name="DNSLookupDiagnosticsOutput"/>
    <component name="SelfTestDiagnosticsOutput"/>
    <component name="SendMagicPacketInput"/>
    <component name="PacketCaptureDiagnosticsInput"/>
    <component name="PacketCaptureDiagnosticsOutput"/>
    <component name="RemoteMeasurementRequestInput"/>
    <component name="RemoteMeasurementRequestOutput"/>
    <component name="CCAMeasurementInput"/>
    <component name="CCAMeasurementOutput"/>
    <component name="CheckCredentialsInput"/>
    <component name="USPLocalAgent"/>
    <component name="STOMP"/>
    <component name="ManagementServerCommon"/>
    <model name="_Device:2.19" ref="Device:2.19"/>
  </import>

  <import file="tr-181-2-deviceinfo.xml"
    spec="urn:broadband-forum-org:tr-181-2-19-deviceinfo">
    <component name="DeviceInfoUSP"/>
    <component name="CauseOfBoot"/>
  </import>

  <import file="tr-181-2-dhcpv4.xml"
    spec="urn:broadband-forum-org:tr-181-2-19-dhcpv4">
    <component name="DHCPv4USP"/>
  </import>

  <import file="tr-181-2-dhcpv6.xml"
    spec="urn:broadband-forum-org:tr-181-2-19-dhcpv6">
    <component name="DHCPv6USP"/>
  </import>

  <import file="tr-181-2-interface.xml"
    spec="urn:broadband-forum-org:tr-181-2-19-interface">
    <component name="InterfaceStatsReset" ref="InterfaceStatsResetUSP"/>
  </import>

  <import file="tr-181-2-wifi-usp.xml"
      spec="urn:broadband-forum-org:tr-181-2-19-wifi-usp">
    <component name="WiFiUSP"/>
  </import>

  <import file="tr-181-2-moca-usp.xml"
      spec="urn:broadband-forum-org:tr-181-2-19-moca-usp">
    <component name="MoCAUSP"/>
  </import>

  <import file="tr-181-2-softwaremodules-usp.xml"
    spec="urn:broadband-forum-org:tr-181-2-19-softwaremodules-usp">
    <component name="SoftwareModulesUSP"/>
  </import>

  <import file="tr-181-2-syslog.xml"
      spec="urn:broadband-forum-org:tr-181-2-19-syslog">
    <component name="SyslogUSP"/>
  </import>

  <import file="tr-181-2-collectiondevice.xml"
      spec="urn:broadband-forum-org:tr-181-2-19-collectiondevice">
    <component name="CollectionDeviceUSP"/>
  </import>

  <import file="tr-181-2-thread.xml"
      spec="urn:broadband-forum-org:tr-181-2-19-thread">
    <component name="ThreadUSP"/>
  </import>

  <import file="tr-181-2-security.xml"
      spec="urn:broadband-forum-org:tr-181-2-19-security">
    <component name="SecurityUSP"/>
  </import>

  <!-- Templates used in object and/or parameter descriptions -->

  <template id="MQTTReconnect">
    {{template|MQTTChange}} If the change needs to be applied immediately, the
    command {{command|ForceReconnect()}} has to be executed.
  </template>

  <template id="MQTTWillChange">
    {{template|MQTTChange}}

    If will handling is enabled (Parameter {{param|WillEnable}} is set to
    {{true}}) and the change needs to be applied immediately, the command
    {{command|ForceReconnect()}} has to be executed.
  </template>

  <template id="Reset">
    {{command|Reset()}} command is invoked
  </template>

  <template id="BULK-DATA-HTTP-REF">
    {{bibref|TR-369|Annex A}}
  </template>

  <template id="BULK-DATA-HTTP-QUERY-REF">
    {{bibref|TR-369|Annex A.1.1}}
  </template>

  <template id="BULK-DATA-HTTP-RETRY-REF">
    {{bibref|TR-369|Annex A.1.2.1}}
  </template>

  <template id="BULK-DATA-WILD-REF">
    {{bibref|TR-369|Annex A.2.1}}
  </template>

  <template id="BULK-DATA-CSV-REF">
    {{bibref|TR-369|Annex A.2.4}}
  </template>

  <template id="BULK-DATA-JSON-REF">
    {{bibref|TR-369|Annex A.2.5}}
  </template>

  <template id="BULK-DATA-OPT-SOLNS">
    The USPEventNotif solution is based on sending a
    {{event|Profile.{i}.Push!}} Event Notification via USP {{bibref|TR-369}}.
  </template>

  <template id="BULK-DATA-TIMESTAMP"/>

  <template id="FAP-GPS-RESET">
    This value is retained across reboots and is only reset after another scan
    completes successfully or {{command|GPSReset()}} is invoked.
  </template>

  <template id="PERIODICSTATISTICS-FORCESAMPLE">
    {{command|Device.PeriodicStatistics.SampleSet.{i}.ForceSample()}}
  </template>

  <template id="PERIODICSTATISTICS-FAILURES">
    {{param|Device.PeriodicStatistics.SampleSet.{i}.Push!.Parameter.{i}.Failures}}
  </template>

  <template id="USP-REQUEST-CHALLENGE">
    {{command|#.RequestChallenge()}}
  </template>

  <template id="USP-CHALLENGE-RESPONSE">
    {{command|#.ChallengeResponse()}}
  </template>

  <template id="XMPP-REF"/>

  <template id="XMPP-APP-REF"/>

  <template id="VENDORCONFIGFILE-DESC">
    Whenever the Agent successfully restores a configuration file as a result
    of the {{command|Restore()}} Command, the Agent MUST update this Object.
  </template>

  <template id="VENDORCONFIGFILE-NAME">
    Otherwise, the value of this parameter MUST be set to the value of the
    Command input argument {{param|Restore().Input.TargetFileName}} used to
    restore this configuration file.
  </template>

  <template id="IPLAYERCAPACITY">
    {{command|Device.IP.Diagnostics.IPLayerCapacity()}}
  </template>

  <model name="Device:2.19" base="_Device:2.19">
    <object base="Device." access="readOnly" minEntries="1" maxEntries="1">

      <parameter name="ProxiedDeviceNumberOfEntries" access="readOnly"
          version="2.12">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <command name="Reboot()" version="2.12" async="false">
        <description>
          Reboot the entity associated with the containing {{object}}.
        </description>
        <input>
          <parameter name="Cause" mandatory="false" version="2.18">
            <description>
              The cause that will be contained within the {{event|#.Boot!}} Event.
              By default the Device SHOULD set this value to {{enum|RemoteReboot}}.
            </description>
            <syntax>
              <string>
                <enumeration value="LocalReboot">
                  <description>
                    A {{object|Device.|absolute}} Event that was the result of a reboot triggered
                    locally on the Device (NOT as a result of a
                    {{command|.Reboot()|model}}}} Command triggered by a remote trigger, e.g.
                    another remote management protocol)
                  </description>
                </enumeration>
                <enumeration value="RemoteReboot">
                  <description>
                    A {{object|Device.|absolute}} Event that was the result of a reboot triggered
                    via the {{command|.Reboot()|model}}} Command or other remote
                    trigger, e.g. another remote management protocol
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>

          <parameter name="Reason" mandatory="false" version="2.18">
            <description>
              The reason of the boot (e.g. power on reset, watchdog, overheat, FAN fault, web userinterface, ...).

              When absent the implementation must set {{param}} to 'Unknown'.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>
        </input>
      </command>

      <event name="Boot!" version="2.12">
        <description>
          Boot event indicating that the {{object}} was rebooted.
        </description>

        <parameter name="CommandKey">
          <description>
            The ''command_key'' supplied when requesting the boot, or {{empty}}
            if the boot was not requested via a USP operation.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <component ref="CauseOfBoot"/>

        <parameter name="Reason" version="2.18">
          <description>
            The reason of the boot (e.g. power on reset, watchdog, overheat, FAN fault, web userinterface, ...).
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="FirmwareUpdated">
          <description>
            {{true}} if the firmware was updated as a result of the boot that
            caused this Event Notification; otherwise {{false}}.
          </description>
          <syntax>
            <boolean/>
          </syntax>
        </parameter>

        <parameter name="ParameterMap">
          <description>
            Boot parameters configured via the recipient Controller's
            {{object|#.LocalAgent.Controller.{i}.BootParameter}} table.

            Formatted as a {{datatype|expand}}
          </description>
          <syntax>
            <dataType ref="JSONObject"/>
          </syntax>
        </parameter>
      </event>

      <command name="FactoryReset()" async="false">
        <description>
          Factory reset the entity associated with the containing {{object}}.
        </description>
        <input>
          <parameter name="Cause" mandatory="false" version="2.18">
            <description>
              The cause that will be contained within the {{event|#.Boot!}} Event.
              By default the Device SHOULD set this value to {{enum|RemoteFactoryReset}}.
            </description>
            <syntax>
              <string>
                <enumeration value="LocalFactoryReset">
                  <description>
                    A {{object|Device.|absolute}} Event that was the result of a factory reset
                    triggered locally on the Device (NOT as a result of a
                    {{command|.FactoryReset()|model}}} Command trigger by a remote trigger,
                    e.g. another remote management protocol)
                  </description>
                </enumeration>
                <enumeration value="RemoteFactoryReset">
                  <description>
                    A {{object|Device.|absolute}} Event that was the result of a factory reset
                    triggered via the {{command|.FactoryReset()|model}} Command or
                    other remote trigger, e.g. another remote management protocol
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>

          <parameter name="Reason" mandatory="false" version="2.18">
            <description>
              The reason of the boot (e.g. power on reset, watchdog, overheat, FAN fault, web userinterface, ...).

              When absent the implementation must set {{param}} to 'Unknown'.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="SelfTestDiagnostics()" async="true" version="2.12">
        <description>
          This diagnostics test is vendor-specific and MAY include testing
          hardware, software, and/or firmware.
        </description>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="SelfTestDiagnosticsOutput" version="2.12"/>
        </output>
      </command>

      <command name="PacketCaptureDiagnostics()" async="true" version="2.13">
        <description>
          This diagnostic command is used to record packet capture data on a
          valid (layer 2 or above) interface in libpcap or pcapng format.
        </description>
        <input>
          <component ref="PacketCaptureDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="PacketCaptureDiagnosticsOutput"/>
        </output>
      </command>

      <command name="ScheduleTimer()" async="true" version="2.12">
        <description>
          Schedule an async timer operation. A scheduled timer MUST persist
          across reboots.

          NOTE: This command changed from synchronous to asynchronous in
          version 2.14.
        </description>
        <input>

          <parameter name="DelaySeconds" mandatory="true">
            <description>
              The number of {{units}} from the time this command is invoked
              until the Agent responds with an OperationComplete Event
              notification (based on the associated subscriptions).
            </description>
            <syntax>
              <unsignedInt>
                <range minInclusive="1"/>
                <units value="seconds"/>
              </unsignedInt>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>

    <object base="Device.DeviceInfo." access="readOnly" minEntries="1"
        maxEntries="1">

      <parameter base="ManufacturerOUI" access="readOnly">
        <description action="append">
          Any change would indicate that it's a new Agent and would therefore
          require a {{event|#.Boot!}} Event with a
          {{enum|LocalFactoryReset|#.Boot!.Cause}} enumerated value in the
          {{param|#.Boot!.Cause}} argument.
        </description>
      </parameter>

      <parameter name="FriendlyName" access="readWrite">
        <description>
          The friendly name of the device.

          In {{bibref|TR-369}} the friendly name is used during the
          advertisement of an endpoint - see section IANA-Registered USP
          Service Names of {{bibref|TR-369}}.
        </description>
        <syntax>
          <string>
            <size maxLength="32"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="CID" access="readOnly"
          dmr:previousParameter="ManufacturerOUI">
        <description>
          Company identifier assigned and registered by the IEEE Registration
          Authority to the entity responsible for this Agent. Represented as a
          six hexadecimal-digit value using all upper-case letters and
          including any leading zeros. {{pattern}}

          This value MUST remain fixed over the lifetime of the Agent,
          including across firmware updates. Any change would indicate that
          it's a new Agent and would therefore require a {{event|#.Boot!}}
          Event with a {{enum|LocalFactoryReset|#.Boot!.Cause}} enumerated
          value in the {{param|#.Boot!.Cause}} argument.
        </description>
        <syntax>
          <string>
            <size minLength="6" maxLength="6"/>
            <pattern value="[0-9A-F]{6}"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="PEN" access="readOnly">
        <description>
          Private Enterprise Number assigned and registered by IANA to the
          entity responsible for this Agent. Represented as a decimal encoding
          of the IANA-assigned number.

          This value MUST remain fixed over the lifetime of the Agent,
          including across firmware updates. Any change would indicate that
          it's a new Agent and would therefore require a {{event|#.Boot!}}
          Event with a {{enum|LocalFactoryReset|#.Boot!.Cause}} enumerated
          value in the {{param|#.Boot!.Cause}} argument.
        </description>
        <syntax>
          <string>
            <size maxLength="10"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="MaxNumberOfActivateTimeWindows" access="readOnly"
          version="2.16">
        <description>
          The maximum number of time windows in a
          {{command|FirmwareImage.{i}.Activate()}} Command that the Device
          supports.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="1" maxInclusive="5"/>
          </unsignedInt>
        </syntax>
      </parameter>
    </object>

    <object base="Device.BulkData." access="readOnly" minEntries="1"
        maxEntries="1">

      <parameter base="Protocols" access="readOnly">
        <syntax>
          <list/>
          <string>
            <enumeration value="Streaming" status="deleted">
              <description>
                IPDR Streaming Protocol {{bibref|IPDR-SP}}

                {{deprecated|2.15|because IPDR Bulk Data Collection is not
                supported in USP}}

                {{obsoleted|2.17}}

                {{deleted|2.18}}
              </description>
            </enumeration>
            <enumeration value="File" status="deleted">
              <description>
                IPDR File Transfer Protocol {{bibref|IPDR-FTP}}

                {{deprecated|2.15|because IPDR Bulk Data Collection is not
                supported in USP}}

                {{obsoleted|2.17}}

                {{deleted|2.18}}
              </description>
            </enumeration>
            <enumeration value="HTTP"/>
            <enumeration value="MQTT"/>
            <enumeration value="USPEventNotif">
              <description>
                User Services Platform (USP - {{bibref|TR-369|Annex A}}) Event
                Notification
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter base="EncodingTypes" access="readOnly">
        <syntax>
          <list/>
          <string>
            <enumeration value="XML" status="deleted">
              <description>
                Used with the IPDR Streaming and File Protocols.
                {{bibref|IPDR-XML}}

                {{deprecated|2.15|because IPDR Bulk Data Collection is not
                supported in USP}}

                {{obsoleted|2.17}}

                {{deleted|2.18}}
              </description>
            </enumeration>
            <enumeration value="XDR" status="deleted">
              <description>
                Used with the IPDR Streaming and File Protocols.
                {{bibref|IPDR-XDR}}

                {{deprecated|2.15|because IPDR Bulk Data Collection is not
                supported in USP}}

                {{obsoleted|2.17}}

                {{deleted|2.18}}
              </description>
            </enumeration>
            <enumeration value="CSV">
              <description action="replace">
                Comma Separated Values. Used with the HTTP and USPEventNotif
                Protocols. {{bibref|RFC4180}}
              </description>
            </enumeration>
            <enumeration value="JSON">
              <description action="replace">
                JavaScript Object Notation. Used with the HTTP and
                USPEventNotif Protocols. {{bibref|RFC7159}}
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>
    </object>

    <object base="Device.BulkData.Profile.{i}." access="readWrite"
        numEntriesParameter="ProfileNumberOfEntries" enableParameter="Enable"
        minEntries="0" maxEntries="unbounded">

      <parameter name="Controller" access="readOnly"
          dmr:previousParameter="Name" version="2.12">
        <description>
          {{reference|the {{object|##.LocalAgent.Controller}} instance that
          created {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.

          The USP Controller referenced by this parameter also defines the set
          of permissions to use when generating the Bulk Data report.
          Furthermore, only the USP Controller referenced by this parameter
          will receive a {{event|Push!}} Event (assuming it has an associated
          Subscription) when the Profile has {{param|Protocol}} configured to
          {{enum|USPEventNotif|Protocol}}, even if another USP Controller has
          an associated Subscription.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="##.LocalAgent.Controller."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="StreamingHost" access="readWrite" status="deleted">
        <description>
          This is the host name or IP Address of the IPDR Collector to be used
          by the CPE to stream bulk data records if this collection profile is
          configured for the IPDR Streaming Protocol {{bibref|IPDR-SP}} (the
          {{param|Protocol}} parameter has a value of
          {{enum|Streaming|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}

          {{obsoleted|2.17}}

          {{deleted|2.18}}
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="StreamingPort" access="readWrite" status="deleted">
        <description>
          This is the port number of the IPDR Collector to be used by the CPE
          to stream bulk data records if this collection profile is configured
          for the IPDR Streaming Protocol {{bibref|IPDR-SP}} (the
          {{param|Protocol}} parameter has a value of
          {{enum|Streaming|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}

          {{obsoleted|2.17}}

          {{deleted|2.18}}
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="0" maxInclusive="65535"/>
          </unsignedInt>
          <default type="object" value="4737"/>
        </syntax>
      </parameter>

      <parameter name="StreamingSessionID" access="readWrite"
          status="deleted">
        <description>
          This is the unique identification of an IPDR Session to be used when
          this collection profile is configured for the IPDR Streaming Protocol
          {{bibref|IPDR-SP}} (the {{param|Protocol}} parameter has a value of
          {{enum|Streaming|#.Protocols}}).

          A Controller MUST NOT configure multiple IPDR Streaming Protocol
          collection profiles with the same {{param}}. Doing so MUST cause the
          CPE to fail the SetParameterValues.

          Within the IPDR Streaming Protocol specification the Session ID has a
          type of a single 'char', but we are restricting the range even
          further (ASCII values of '0' - '9' and 'A' - 'Z').

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}

          {{obsoleted|2.17}}

          {{deleted|2.18}}
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="48" maxInclusive="57"/>
            <range minInclusive="65" maxInclusive="90"/>
          </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="FileTransferURL" access="readWrite" status="deleted">
        <description>
          This is the {{datatype}} within the CPE that is used by an IPDR
          Collector to retrieve the IPDRDocs when this collection profile is
          configured for the IPDR File Transfer Protocol {{bibref|IPDR-FTP}}
          (the {{param|Protocol}} parameter has a value of
          {{enum|File|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}

          {{obsoleted|2.17}}

          {{deleted|2.18}}
        </description>
        <syntax>
          <dataType ref="URL"/>
        </syntax>
      </parameter>

      <parameter name="FileTransferUsername" access="readWrite"
          status="deleted">
        <description>
          Username used for authentication of the {{param|FileTransferURL}}.

          This is the {{param}} that the IPDR Collector uses to access the CPE
          when this collection profile is configured for the IPDR File Transfer
          Protocol {{bibref|IPDR-FTP}} (the {{param|Protocol}} parameter has a
          value of {{enum|File|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}

          {{obsoleted|2.17}}

          {{deleted|2.18}}
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="FileTransferPassword" access="readWrite"
          status="deleted">
        <description>
          Password used for authentication of the {{param|FileTransferURL}}.

          This is the {{param}} that the IPDR Collector uses to access the CPE
          when this collection profile is configured for the IPDR File Transfer
          Protocol {{bibref|IPDR-FTP}} (the {{param|Protocol}} parameter has a
          value of {{enum|File|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}

          {{obsoleted|2.17}}

          {{deleted|2.18}}
        </description>
        <syntax secured="true">
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ControlFileFormat" access="readWrite"
          status="deleted">
        <description>
          If this collection profile is configured for the IPDR File Transfer
          Protocol {{bibref|IPDR-FTP}} (the {{param|Protocol}} parameter has a
          value of {{enum|File|#.Protocols}}) then the control file names will
          be of the following format:

          :
            &lt;ControlFilePrefix&gt;_&lt;ControlFilePolicy&gt;.&lt;ControlFileSuffix&gt;

          Where the following rules apply:

          * ControlFilePrefix MUST NOT contain an underscore '_' or any other
            character not suitable for a file name.

          * ControlFilePolicy MUST contain one or more 'N' characters, where
            the number of 'N' characters denotes the number of digits in the
            sequence number, including leading zeros as necessary to match the
            number of 'N' characters.

          * ControlFileSuffix is a file extension.

          For example, BulkData_NNNN.log where "BulkData" would be the prefix,
          "NNNN" would be the policy, and "log" would be the suffix. Files
          adhering to this file format would look like: BulkData_0000.log,
          BulkData_0001.log, etc.

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}

          {{obsoleted|2.17}}

          {{deleted|2.18}}
        </description>
        <syntax>
          <string>
            <size maxLength="128"/>
          </string>
        </syntax>
      </parameter>

      <event name="Push!" version="2.13">
        <description>
          Bulk Data Push event for delivering a bulk data report within a USP
          Notification message.
        </description>

        <parameter name="Data">
          <description>
            The contents of the bulk data report in the configured CSV or JSON
            Encoding Type.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>
      </event>

      <command name="ForceCollection()" version="2.15" async="false">
        <description>
          Start the bulk data collection and transmission as defined in this
          profile immediately, regardless of the current values of the
          {{param|Enable}} and {{param|ReportingInterval}} parameters.

          This command can be used for testing of the bulk data collection
          mechanism and profile but also to preempt any regular schedule
          without affecting it.
        </description>
      </command>
    </object>

    <object name="Device.LocalAgent." access="readOnly" minEntries="1"
        maxEntries="1" version="2.12">
      <description>
        This object contains general information about the USP Agent itself.
        For information related to the Device that hosts the Agent, please
        reference the {{object|#.DeviceInfo}} object.

        NOTE: The Vendor Log File table ({{object|#.DeviceInfo.VendorLogFile}})
        details are located on the {{object|#.DeviceInfo}} object.
      </description>

      <component ref="USPLocalAgent" version="2.12"/>

      <event name="Periodic!" dmr:previousParameter="UpTime">
        <description>
          Periodic event configured via the recipient Controller's
          {{param|Controller.{i}.PeriodicNotifInterval}} and
          {{param|Controller.{i}.PeriodicNotifTime}} parameters.
        </description>
      </event>

      <event name="WakeUp!">
        <description>
          Wake-up event.
        </description>
      </event>

      <event name="TransferComplete!">
        <description>
          Indicates that a file has been transferred to or from the Device. The
          event is sent when the transfer has either completed successfully (in
          which case {{param|FaultCode}} will be zero), or else has failed (in
          which case {{param|FaultCode}} will be non-zero and
          {{param|FaultString}} will give further details).

          The file transfer can be requested via a USP operation or via some
          other mechanism. If it's requested via a USP operation
          {{param|Command}}, {{param|CommandKey}} and {{param|Requestor}} give
          further details.
        </description>

        <parameter name="Command">
          <description>
            The Path Name of the command that requested the transfer, or
            {{empty}} if the transfer was not requested via a USP operation.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="CommandKey">
          <description>
            The ''command_key'' supplied when requesting the transfer, or
            {{empty}} if the transfer was not requested via a USP operation.
          </description>
          <syntax>
            <string/>
            <default type="parameter" value=""/>
          </syntax>
        </parameter>

        <parameter name="Requestor">
          <description>
            The Endpoint ID of the Controller that requested the transfer, or
            {{empty}} if no Controller requested it.
          </description>
          <syntax>
            <string/>
            <default type="parameter" value=""/>
          </syntax>
        </parameter>

        <parameter name="TransferType">
          <description>
            The type (direction) of the transfer.
          </description>
          <syntax>
            <string>
              <enumeration value="Download">
                <description>Downstream transfer; to the Agent.</description>
              </enumeration>
              <enumeration value="Upload">
                <description>Upstream transfer; from the Agent.</description>
              </enumeration>
            </string>
            <default type="parameter" value="Download"/>
          </syntax>
        </parameter>

        <parameter name="Affected">
          <description>
            The Path Name of the Object or Object Instance that was affected by
            the transfer, or {{empty}} if no data model object was affected by
            the transfer.
          </description>
          <syntax>
            <string/>
            <default type="parameter" value=""/>
          </syntax>
        </parameter>

        <parameter name="TransferURL">
          <description>
            The {{datatype}} from or to which this transfer was performed, or
            {{empty}} if no such URL is available.
          </description>
          <syntax>
            <dataType ref="URL"/>
          </syntax>
        </parameter>

        <parameter name="StartTime">
          <description>
            The date and time in UTC at which the transfer was started. The
            Device SHOULD record this information and report it in this
            argument, but if this information is not available, the value of
            this argument MUST be set to the ''Unknown Time'' value.
          </description>
          <syntax>
            <dateTime/>
            <default type="parameter" value="0001-01-01T00:00:00Z"/>
          </syntax>
        </parameter>

        <parameter name="CompleteTime">
          <description>
            The date and time in UTC at which the transfer was fully completed.
            This need only be filled in if the transfer has been fully
            completed. The Device SHOULD record this information and report it
            in this argument, but if this information is not available or the
            transfer has not completed, the value of this argument MUST be set
            to the ''Unknown Time'' value.
          </description>
          <syntax>
            <dateTime/>
            <default type="parameter" value="0001-01-01T00:00:00Z"/>
          </syntax>
        </parameter>

        <parameter name="FaultCode">
          <description>
            The numerical fault code as defined in {{bibref|TR-369}}. A value
            of 0 (zero) indicates no fault.
          </description>
          <syntax>
            <unsignedInt/>
            <default type="parameter" value="0"/>
          </syntax>
        </parameter>

        <parameter name="FaultString">
          <description>
            A human-readable text description of the fault. This field SHOULD
            be {{empty}} if the {{param|FaultCode}} equals 0 (zero).
          </description>
          <syntax>
            <string>
              <size maxLength="256"/>
            </string>
            <default type="parameter" value=""/>
          </syntax>
        </parameter>
        <parameter name="CheckSumAlgorithm" version="2.17">
          <description>
              The hash algorithm that was used to generate the checksum
              for the transferred file.
          </description>
            <syntax>
              <string>
                <enumeration value="SHA-1">
                  <description>
                    As specified in {{bibref|RFC3174}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-224">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-256">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-384">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-512">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="Unknown">
                  <description>
                    There was no algorithm specified for the transferred file.
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>

          <parameter name="CheckSum" version="2.17">
            <description>
              The hash value that was used for the transferred file. This hash value was
              generated using transferred file content and the {{param|CheckSumAlgorithm}}.

              If the argument is {{empty}}, not present, or the {{param|CheckSumAlgorithm}}
              is {{enum|Unknown|CheckSumAlgorithm}}, then the
              Controller can assume that the checksum is not applicable or
              was not generated for this transfer.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
      </event>

      <command name="AddCertificate()" async="false">
        <description>
          This command is issued to allow a Controller (with the proper
          permissions) to add a new certificate to
          {{object|#.Certificate.{i}}}. This does not automatically produce a
          trust relationship with the host identified by the Certificate. To
          produce a trust relationship, an entry is required to exist in
          {{param|#.Controller.{i}.Credential}} or
          {{param|#.ControllerTrust.Credential.{i}.Credential}} that references
          the new {{object|#.Certificate.{i}}} entry. The Agent will use the
          Serial Number and Issuer fields from the input {{param|Certificate}}
          to populate the {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}} parameters. If
          {{object|#.Certificate}} already has an instance with the same
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}} parameters, this command will
          fail. To replace an instance with the same
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}}, the existing instance must first
          be deleted.
        </description>
        <input>

          <parameter name="Alias">
            <description>
              An optional input the Controller can use to specify the
              {{param|##.Certificate.{i}.Alias}} value for the added entry. If
              provided as an input and the value already exists in
              {{object|##.Certificate.{i}}}, this command will fail.
            </description>
            <syntax>
              <dataType ref="Alias"/>
            </syntax>
          </parameter>

          <parameter name="Certificate" mandatory="true">
            <description>
              The X.509 certificate in Privacy-enhanced Electronic Mail (PEM)
              {{bibref|RFC7468}} format.
            </description>
            <syntax>
              <string>
                <size maxLength="65535"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>

      <parameter name="SupportedThresholdOperator" access="readOnly"
          dmr:previousParameter="SupportedFingerprintAlgorithms" version="2.13">
        <description>
          {{list|each entry is a threshold operation for
          {{param|Threshold.{i}.ThresholdOperator}} supported by the Agent}}
        </description>
        <syntax>
          <list/>
          <string>
            <enumeration value="Rise">
              <description>
                Parameter value changes from below the
                {{param|Threshold.{i}.ThresholdValue}} to a value above
              </description>
            </enumeration>
            <enumeration value="Fall">
              <description>
                Parameter value changes from above the
                {{param|Threshold.{i}.ThresholdValue}} to a value below
              </description>
            </enumeration>
            <enumeration value="Cross">
              <description>
                Parameter value either changes from above the
                {{param|Threshold.{i}.ThresholdValue}} to a value below or vice
                versa
              </description>
            </enumeration>
            <enumeration value="Eq">
              <description>
                Parameter value changes from any value to the
                {{param|Threshold.{i}.ThresholdValue}}
              </description>
            </enumeration>
            <enumeration value="NotEq">
              <description>
                Parameter value changes from the
                {{param|Threshold.{i}.ThresholdValue}} to any other value
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter name="ThresholdNumberOfEntries" access="readOnly"
          dmr:previousParameter="MaxSubscriptionChangeAdoptionTime"
          version="2.13">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

     <parameter name="WatchdogNumberOfEntries" access="readOnly"
        version="2.18">
        <description>
            {{numentries}}
        </description>
            <syntax>
                  <unsignedInt/>
            </syntax>
     </parameter>

      <parameter name="SubscriptionNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="RequestNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="MonitorNumberOfEntries" access="readOnly"
          version="2.16">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="SupportedNumberOfSubscriptions" access="readOnly"
          version="2.16">
        <description>
          An indication of the maximum number of {{object|Subscription}}
          instances supported by this implementation or -1 if no hard limit
          exists.
        </description>
        <syntax>
          <int/>
          <default type="implementation" value="-1"/>
        </syntax>
      </parameter>
    </object>

    <object name="Device.LocalAgent.Threshold.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="ThresholdNumberOfEntries" enableParameter="Enable"
        dmr:previousObject="Device.LocalAgent.MTP.{i}.UDS." version="2.13">
      <description>
        Each {{object}} instance of this table represents a Threshold Event.

        {{param|ThresholdParam}} is monitored to determine if it has met the
        {{param|ThresholdOperator}} condition against {{param|ThresholdValue}},
        when it meets the condition a {{event|Triggered!}} Event is sent.
        {{param|ThresholdParam}} may only reference integer parameters and
        {{param|ThresholdValue}} only uses integer values. For example:

            {{param|ReferencePath}}: Device.Ethernet.Interface.[Enable=="1"].Stats.

            {{param|ThresholdParam}}: BytesSent

            {{param|ThresholdOperator}}: Rise

            {{param|ThresholdValue}}: 100000

        This would trigger a {{event|Triggered!}} Event whenever a value of a
        parameter matching
        Device.Ethernet.Interface.[Enable==1].Stats.BytesSent rises from below
        to above 100000.

        When creating a {{object}}, if the {{param|ReferencePath}},
        {{param|ThresholdParam}} or {{param|ThresholdValue}} are invalid (not
        in the supported Data Model), the object will not be created.

        If the concatenation of {{param|ReferencePath}} and
        {{param|ThresholdParam}} reference a parameter that isn't in the
        instantiated data model, then there will be no {{event|Triggered!}}
        Event.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <component ref="Alias" version="2.13"/>

      <parameter name="Enable" access="readWrite">
        <description>
          Enable/Disable this {{object}} instance.

          If the {{object}} instance is disabled, the {{event|Triggered!}}
          Event will not be invoked, even if there is a
          {{object|#.Subscription}} instance that references it.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="OperatingMode" access="readWrite">
        <description>
          Determines whether to disable this {{object}} instance after the
          {{event|Triggered!}} Event has been invoked.
        </description>
        <syntax>
          <string>
            <enumeration value="Normal">
              <description>
                The {{object}} will execute the action as long as the
                {{param|Enable}} parameter is {{true}}.
              </description>
            </enumeration>
            <enumeration value="Single">
              <description>
                After invoking the {{event|Triggered!}} Event, the
                {{param|Enable}} parameter will be automatically set to
                {{false}}.
              </description>
            </enumeration>
          </string>
          <default type="object" value="Normal"/>
        </syntax>
      </parameter>

      <parameter name="ReferencePath" access="readWrite">
        <description>
          The concatenation of {{param}} and {{param|ThresholdParam}} refers to
          the parameter being checked for the threshold test.

          {{param}} can be either an Object Path, Object Instance Path, or and
          Object Instance Path with a Search Expression instead of an Instance
          Identifier, as defined in the introduction section of
          {{bibref|TR-369}}.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="ThresholdParam" access="readWrite">
        <description>
          The concatenation of {{param|ReferencePath}} and {{param}} refers to
          the parameter being checked for the threshold test.

          {{param}} is the name of the Parameter in the context of
          {{param|ReferencePath}}.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="ThresholdOperator" access="readWrite">
        <description>
          The operator used for the threshold test.
        </description>
        <syntax>
          <string>
            <enumerationRef
                targetParam="Device.LocalAgent.SupportedThresholdOperator"/>
          </string>
          <default type="object" value="Rise"/>
        </syntax>
      </parameter>

      <parameter name="ThresholdValue" access="readWrite">
        <description>
          The Value used for the threshold test.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="Controller" access="readOnly" version="2.15">
        <description>
          {{reference|the {{object|#.Controller}} instance that created
          {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.

          The USP Controller referenced by this parameter also defines the set
          of permissions to use when evaluating the threshold. Furthermore,
          only the USP Controller referenced by this parameter will receive a
          {{event|Triggered!}} Event (assuming it has an associated
          Subscription), even if another USP Controller has an associated
          Subscription.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="#.Controller."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <event name="Triggered!">
        <description>
          Triggered event requested via a {{object}} object.

          When the {{param|ThresholdParam}} that is in the
          {{param|ReferencePath}} changes and the threshold test conditation
          changes from {{false}} to {{true}}, then the Triggered Event will be
          invoked. The {{event}} will only be eligible for retriggering if the
          test condition is fulfilled again.
        </description>

        <parameter name="ParamPath">
          <description>
            The parameter ({{param|#.ReferencePath}} and
            {{param|#.ThresholdParam}}) for which the threshold has been
            triggered.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="ParamValue">
          <description>
            The new ({{param|#.ReferencePath}} and {{param|#.ThresholdParam}})
            Value.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>
      </event>
    </object>

    <object name="Device.LocalAgent.Watchdog.{i}." access="readWrite" minEntries="0" maxEntries="unbounded" numEntriesParameter="WatchdogNumberOfEntries" enableParameter="Enable" dmr:previousObject="Device.LocalAgent.Threshold.{i}." version="2.18">
        <description>
          Each {{object}} instance of this table represents a Watchdog Event.
          A {{object}} instance is used to detect the lack of an expected update of a parameter value within a certain time window {{param|ReloadTimerValue}}. In case this timer expires, meaning {{param|RemainingTimerValue}} becomes 0,
          a notification event {{event|Watchdog!}}, will be sent to the {{param|Controller}}. This is because timely parameter updates are required, e.g. for SLA or security reasons.
        </description>
        <uniqueKey functional="false">
          <parameter ref="Alias"/>
        </uniqueKey>

        <component ref="Alias"/>

        <parameter name="Enable" access="readWrite">
          <description>
            Enable/Disable this {{object}} instance.
            If the {{object}} instance is disabled, the {{event|Watchdog!}} will not be invoked, even if there is a {{object|#.Subscription}} instance that references it. The {{param|RemainingTimerValue}} will be set to 0.
            If the {{object}} instance is set to enabled, the {{param|RemainingTimerValue}} will be set to the value of {{param|ReloadTimerValue}}.
          </description>
          <syntax>
           <boolean/>
           <default type="object" value="false"/>
         </syntax>
        </parameter>

        <parameter name="ReloadTimerValue" access="readWrite">
         <description>
          Watchdog timer reload value in {{units}}. Every time the {{param|Reference}} value is updated, this {{param}} is used to reload the {{param|RemainingTimerValue}}.
         </description>
         <syntax>
           <unsignedInt>
             <units value="seconds"/>
           </unsignedInt>
         </syntax>
        </parameter>

        <parameter name="RemainingTimerValue" activeNotify="canDeny" access="readOnly">
          <description>
             This value is decreased every {{units}}. When 0, the {{object}} timer expires, an {{event|Watchdog!}} event will be generated.
          </description>
          <syntax>
            <unsignedInt>
              <units value="seconds"/>
            </unsignedInt>
          </syntax>
        </parameter>

        <parameter name="Status" access="readOnly">
          <description>
            The operational status of the {{object}} instance.

            When the value of {{param|RemainingTimerValue}} becomes 0, this {{param}} will become {{enum|Expired}} and a {{event|Watchdog!}} event will be triggered. {{object}} will not be restarted, meaning that the {{param|RemainingTimerValue}} will stay at 0 until the {{command|Reset()}} command is invoked.
          </description>
          <syntax>
            <string>
              <enumeration value="Inactive">
                <description>
                  The {{param|Enable}} is disabled.
                </description>
              </enumeration>
              <enumeration value="Active">
                <description>
                  The {{param|Enable}} is enabled. The {{object}} timer is running. This means that {{param|RemainingTimerValue}} is decreased every second.
                </description>
              </enumeration>
              <enumeration value="Expired">
                <description>
                  The {{param|Enable}} is enabled. The {{object}} timer expired whereby {{param|RemainingTimerValue}} is set to 0.
                </description>
              </enumeration>
            </string>
            <default type="object" value="Inactive"/>
          </syntax>
        </parameter>

        <parameter name="Reference" access="readWrite">
          <description>
            The {{param}} consists of a Path Name or Search Path that determines the element(s) of the data model that the {{object}} is applicable to.
            When more than one {{param}} is used, the Watchdog timer will only be stopped if all Parameters, referenced by {{param}} are updated. If one of the referenced Parameters is not updated, either with the same or different value,
            an {{event|Watchdog!}} will be generated.
            If all parameters, referenced by {{param}}, are updated, the {{param|RemainingTimerValue}} is set to the value of the {{param|ReloadTimerValue}}.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="SeverityIndication" access="readWrite">
          <description>
            Provides an indication of the severity which will be included in the generated {{event|Watchdog!}} event when the {{object}} instance expires.
          </description>
          <syntax>
            <string>
              <enumeration value="Info">
              </enumeration>
              <enumeration value="Minor">
              </enumeration>
              <enumeration value="Major">
              </enumeration>
              <enumeration value="Critical">
              </enumeration>
            </string>
            <default type="object" value="Info"/>
          </syntax>
        </parameter>

        <parameter name="Controller" access="readOnly" version="2.18">
          <description>
            {{reference|the {{object|#.Controller}} instance that created
            {{object}}|delete}}

            The value of this parameter is automatically populated by the USP
            Agent upon {{object}} creation using the reference to the USP
            Controller that created the instance.

            The USP Controller referenced by this parameter also defines the set
            of permissions to use when evaluating the Watchdog. Furthermore,
            only the USP Controller referenced by this parameter will receive a
            {{event|Watchdog!}} Event (assuming it has an associated
            Subscription), even if another USP Controller has an associated
            Subscription.
          </description>
          <syntax>
            <string>
              <pathRef refType="strong" targetParent="#.Controller."
                  targetType="row"/>
            </string>
          </syntax>
        </parameter>

        <command name="Reset()" version="2.18" async="false">
          <description>
             When the {{command}} is invoked, the {{param|RemainingTimerValue}} will be set to the {{param|ReloadTimerValue}} and the {{param|Status}} to either {{enum|Active|Status}} or {{enum|Inactive|Status}} depending on the value of the {{param|Enable}} parameter.
          </description>
        </command>

        <event name="Watchdog!">
            <description>
              Watchdog event requested via a {{object}} object.

              When the {{param|RemainingTimerValue}} becomes 0 because the value of the
              {{param|Reference}} was not updated then the Watchdog Event will be
              invoked.
            </description>
            <parameter name="Reference">
              <description>
                The parameter {{param|#.Reference}} for which the Watchdog has been
                triggered.
              </description>
              <syntax>
                <string/>
              </syntax>
            </parameter>
            <parameter name="ReloadTimerValue">
              <description>
                The {{param|#.ReloadTimerValue}} Value in {{units}}.
              </description>
              <syntax>
                <unsignedInt>
                  <units value="seconds"/>
                </unsignedInt>
              </syntax>
            </parameter>
            <parameter name="SeverityIndication">
              <description>
                The {{param|#.SeverityIndication}} Value.
              </description>
              <syntax>
                <string/>
              </syntax>
            </parameter>
        </event>
    </object>

    <object name="Device.LocalAgent.Monitor.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="MonitorNumberOfEntries" enableParameter="Enable"
        dmr:previousObject="Device.LocalAgent.Threshold.{i}." version="2.16">
      <description>
        Each {{object}} instance of this table represents an OnChange Event.

        This would trigger a {{event|OnChange!}} Event whenever a value of a
        parameter(s) matching {{param|ReferenceList}} changed during the time
        interval specified by {{param|Interval}}.

        When creating a {{object}}, if the {{param|ReferenceList}} is invalid
        (not in the supported Data Model), the object will not be created.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <component ref="Alias" version="2.16"/>

      <parameter name="Enable" access="readWrite">
        <description>
          Enable/Disable this {{object}} instance.

          If the {{object}} instance is disabled, the {{event|OnChange!}} Event
          will not be invoked, even if there is a {{object|#.Subscription}}
          instance that references it.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="Interval" access="readWrite">
        <description>
          Monitor interval in {{units}}. Parameters changed during this time
          window will be part of the {{event|OnChange!}} Event. When set to
          ''0'', the Agent will send the {{event|OnChange!}} Event immediately
          when it notices a change in one or more of the subscribed parameters.
        </description>
        <syntax>
          <unsignedInt>
            <units value="microseconds"/>
          </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="ReferenceList" access="readWrite">
        <description>
          Each entry in the list is a Path Name or Search Path that determines
          the element(s) of the data model that the {{object}} is applicable
          to.
        </description>
        <syntax>
          <list/>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Controller" access="readOnly">
        <description>
          {{reference|the {{object|#.Controller}} instance that created
          {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.

          The USP Controller referenced by this parameter also defines the set
          of permissions to use when evaluating the to be monitored changes.
          Furthermore, only the USP Controller referenced by this parameter
          will receive a {{event|OnChange!}} Event (assuming it has an
          associated Subscription), even if another USP Controller has an
          associated Subscription.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="#.Controller."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <event name="OnChange!">
        <description>
          OnChange event requested via a {{object}} object.

          When the values of the parameters specified by
          {{param|ReferenceList}} change within in the configured
          {{param|#.Interval}}, the agent MUST send an OnChange event.
        </description>

        <object name="ChangeSet.{i}." minEntries="0" maxEntries="unbounded">
          <description>
            Each ChangeSet entry contains the changes for a monitored object.
            If multiple monitored objects change within the
            {{param|##.Interval}}, there will be multiple ChangeSet entries.

            When a parameter of an already included object changes multiple
            times within in the configured {{param|##.Interval}}. The parameter
            must be included in the {{object}} instance, where the {{param|ObjectPath}} was previously used, and a
            new {{object|Parameter.{i}}} instance MUST be created.
          </description>
          <uniqueKey functional="true">
            <parameter ref="ObjectPath"/>
          </uniqueKey>

          <parameter name="ObjectPath">
            <description>
              Object path of the changed parameters.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>
        </object>

        <object name="ChangeSet.{i}.Parameter.{i}." minEntries="0"
            maxEntries="unbounded">
          <description>
            OnChange parameter(s) table for the report sent by this event. This
            table contains entries for parameters whose values have been
            changed during the configured {{param|###.Interval}}.
          </description>

          <uniqueKey functional="true">
            <parameter ref="Name"/>
            <parameter ref="ChangeTime"/>
          </uniqueKey>

          <parameter name="Name">
            <description>
              Name of the changed parameter.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Value">
            <description>
              New value of the parameter specified by {{param|Name}}.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="OldValue">
            <description>
              Previous value of the parameter specified by {{param|Name}}.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="ChangeTime">
            <description>
              The date and time when the parameter was changed in UTC, which
              MUST be specified to microsecond precision. For example:
              2008-04-09T15:01:05.123456Z
            </description>
            <syntax>
              <dateTime/>
            </syntax>
          </parameter>
        </object>
      </event>
    </object>

    <object base="Device.LocalAgent.Controller.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="ControllerNumberOfEntries"
        enableParameter="Enable">

      <command name="ScheduleTimer()" status="deleted" async="false"
          dmr:previousParameter="USPNotifRetryIntervalMultiplier">
        <description>
          Schedule a ''Timer!'' event on the associated {{object}}.

          {{deprecated|2.14|because it was replaced by a more flexible
          asynchronous {{command|##.ScheduleTimer()}}}}

          {{obsoleted|2.16}}

          {{deleted|2.17}}
        </description>
        <input>

          <parameter name="DelaySeconds" mandatory="true">
            <description>
              The number of {{units}} from the time this command is invoked
              until the Agent initiates a Timer! Event notification (based on
              the associated subscriptions).
            </description>
            <syntax>
              <unsignedInt>
                <range minInclusive="1"/>
                <units value="seconds"/>
              </unsignedInt>
            </syntax>
          </parameter>
        </input>
      </command>

      <event name="Timer!" status="deleted">
        <description>
          Timer event requested via a ScheduleTimer() command invoked on the
          same Controller instance via an Operate USP message.

          {{deprecated|2.14|because the associated {{command|ScheduleTimer()}}
          was replaced by a more flexible asynchronous
          {{command|##.ScheduleTimer()}}}}

          {{obsoleted|2.16}}

          {{deleted|2.17}}
        </description>

        <parameter name="CommandKey">
          <description>
            The ''command_key'' supplied when requesting the timer event.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>
      </event>

      <command name="AddMyCertificate()" async="false">
        <description>
          This command is issued to allow a Controller to add a new certificate
          for itself. This can be useful when the current certificate is
          expiring or has become compromised. This command creates a new entry
          in {{object|#.Certificate}} and adds a reference to the new entry to
          the Controller's {{param|#.Controller.{i}.Credential}}. The Agent
          will use the Serial Number and Issuer fields from the input
          {{param|Certificate}} to populate the
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}} parameters. If
          {{object|#.Certificate}} already has an instance with the same
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}} parameters, this command will
          fail. To replace an instance with the same
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}}, the existing instance must first
          be deleted.

          This command can only be used by the Controller to whom the object
          belongs. If the Controller issuing the USP Operate message is a
          different Controller, the message MUST be denied.
        </description>
        <input>

          <parameter name="Alias">
            <description>
              An optional input the Controller can use to specify the
              {{param|###.Certificate.{i}.Alias}} value for the added entry. If
              provided as an input and the value already exists in
              {{object|###.Certificate.{i}}}, this command will fail.
            </description>
            <syntax>
              <dataType ref="Alias"/>
            </syntax>
          </parameter>

          <parameter name="Certificate" mandatory="true">
            <description>
              The X.509 certificate in Privacy-enhanced Electronic Mail (PEM)
              {{bibref|RFC7468}} format.
            </description>
            <syntax>
              <string>
                <size maxLength="65535"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="SendOnBoardRequest()" async="false">
        <description>
          Requests the Agent to send an ''OnBoardRequest'' notification to this
          Controller. This sets the value of {{param|OnBoardingComplete}}
          to {{false}}.
        </description>
      </command>

      <parameter name="BootParameterNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="OnBoardingComplete" access="readWrite" version="2.17">
        <description>
          Signifies whether the onboarding is completed for this
          Controller.

          When set to {{false}}, the Controller hasn't completed its onboarding
          procedure and the agent MUST send it an OnBoardRequest USP
          Notification when the Controller's {{param|Enable}} parameter is
          {{true}}. This OnBoardRequest MUST be retried until the Controller
          confirms it has received the request as required by
          {{bibref|TR-369|R-NOT.5}} and {{bibref|TR-369|R-NOT.6}}.

          The value of this parameter SHOULD be set to {{true}} by the Controller
          when it is done with its onboarding procedure or it can be set by the
          Agent itself when it knows the onboarding has been completed.

          While the value of this parameter is {{false}} it will also restart the OnBoardRequest procedure according to
          the {{param|OnBoardingRestartTime}} parameter.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>
      <parameter name="OnBoardingRestartTime" access="readWrite" version="2.17">
        <description>
          This parameter is used to configure a linear retry mechanism for the
          OnBoardRequest. It represents the time in {{units}} before the
          OnBoardRequest is retried.

          The OnBoardRequest notification is a USP notification that requires
          a NotifyResponse message like any other notification that needs to be
          retried. OnBoardRequest notifications must follow the default retry
          mechanism as required by {{bibref|TR-369|R-NOT.6}} until the
          Controller has confirmed the notification with a NotifyResponse
          message. However, the onboarding procedure typically requires several
          actions from the Controller before it can be considered as complete
          and things can go wrong during this procedure. The value of this
          parameter can be set to configure how long the Agent should wait
          before it sends another OnBoardRequest. This timer kicks in as soon
          as the Agent receives the NotifyResponse message for the previous
          OnBoardRequest. The timer is cancelled when the
          {{param|OnBoardingComplete}} parameter is set to {{true}}.

          When the value of this parameter is set to 0, the OnBoardRequest is
          not retried after the notification retry mechanism has
          been completed.
        </description>
        <syntax>
          <unsignedInt>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>
    </object>

    <object base="Device.LocalAgent.Controller.{i}.MTP.{i}.WebSocket."
        access="readOnly" minEntries="0" maxEntries="1">

      <command name="Reset()" async="false">
        <description>
          If enabled, this command will either request to start or restart an
          WebSocket session with the Controller.
        </description>
      </command>
    </object>

    <object name="Device.LocalAgent.Controller.{i}.TransferCompletePolicy."
        access="readOnly" minEntries="1" maxEntries="1" version="2.12">
      <description>
        The policy defined in this object determines the conditions under which
        the USP Agent notifies a USP Controller, that has an appropriate
        Subscription, of the completion of file transfers.
      </description>

      <parameter name="ResultTypeFilter" access="readWrite">
        <description>
          Indicates the transfer results that MUST be included when the USP
          Agent notifies a USP Controller of file transfers. Transfer results
          omitted from this list MUST NOT be included when the USP Agent
          notifies a USP Controller.
        </description>
        <syntax>
          <string>
            <enumeration value="Success">
              <description>
                The autonomous file transfer completed successfully; i.e., the
                {{event|##.TransferComplete!}} event's
                {{param|##.TransferComplete!.FaultCode}} was zero
              </description>
            </enumeration>
            <enumeration value="Failure">
              <description>
                The autonomous file transfer did not complete successfully;
                i.e., the the {{event|##.TransferComplete!}} event's
                {{param|##.TransferComplete!.FaultCode}} was non-zero
              </description>
            </enumeration>
            <enumeration value="Both">
              <description>Success and Failure</description>
            </enumeration>
          </string>
        </syntax>
      </parameter>
    </object>

    <object name="Device.LocalAgent.Controller.{i}.BootParameter.{i}."
        access="readWrite" minEntries="0" maxEntries="unbounded"
        numEntriesParameter="BootParameterNumberOfEntries"
        enableParameter="Enable" version="2.12">
      <description>
        This table provides the Controller with the ability to dictate the
        Parameters that are delivered via ''Boot!'' events.

        Any Parameter (identified by {{param|ParameterName}}) contained in this
        table MUST be included within the ''param_map'' element of the
        ''Boot!'' event.
      </description>
      <uniqueKey functional="true">
        <parameter ref="ParameterName"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <component ref="Alias" version="2.12"/>

      <parameter name="Enable" access="readWrite">
        <description>
          Enables or disables this {{object}}.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="ParameterName" access="readWrite">
        <description>
          A pattern that describes the Parameter(s) to be included in the
          ''param_map'' element of a ''Boot!'' event. Specifically, patterns
          with wildcards (an "*" character) in place of Instance Identifiers
          are allowed.

          If the pattern does not match any existing Parameters at the time
          that the Agent is creating the ''Boot!'' event, then this
          {{object|#.BootParameter}} instance is not included in the
          ''param_map'' of the ''Boot!'' event.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
          <default type="object" value=""/>
        </syntax>
      </parameter>
    </object>

    <object name="Device.LocalAgent.Controller.{i}.E2ESession."
        access="readOnly" minEntries="1" maxEntries="1" version="2.12">
      <description>
        The {{object}} object represents the End to End (E2E) Session Context
        functionality for this {{object|##.Controller.{i}}} object instance.
      </description>

      <parameter name="Enable" access="readWrite" status="deleted">
        <description>
          Enable/Disable this {{object}} instance.

          When {{true}}, Session Context is used when exchanging USP Records
          with the remote endpoint represented by this
          {{object|##.Controller.{i}}} object instance.

          When {{false}}, Session Context is not used when exchanging USP
          Records with the remote endpoint represented by this
          {{object|##.Controller.{i}}} object instance.

          {{deprecated|2.15|because it is replaced by {{param|SessionMode}}}}

          {{obsoleted|2.17}}

          {{deleted|2.18}}
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="SessionMode" access="readWrite" version="2.15">
        <description>
          The desired usage mode of an End-to-End Session Context with this
          particular Controller.
        </description>
        <syntax>
          <string>
            <enumeration value="Require">
              <description>
                A Session Context MUST be used and no USP Messages are allowed
                to be exchanged prior to establishment.

                Setting the parameter to Require MUST result in the
                establishment of a Session Context.
              </description>
            </enumeration>
            <enumeration value="Allow">
              <description>
                A Session Context MAY be used but is not required.

                When setting the parameter to Allow, the Agent MUST NOT
                initiate Session Context but MUST perpetuate any existing
                Session Context or Controller-initiated Session Context.
              </description>
            </enumeration>
            <enumeration value="Forbid">
              <description>
                A Session Context MUST NOT be used.

                Setting the parameter to Forbid MUST result in the immediate
                termination of any established Session Context.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter name="Status" access="readOnly">
        <description>
          The current status of the Session Context.
        </description>
        <syntax>
          <string>
            <enumeration value="Up"/>
            <enumeration value="Negotiating" optional="true">
              <description>
                A new Session Context is being negotiated (i.e., a USP Record
                with sequence_id of 1 and session_id not previously used with
                this remote endpoint was sent and response has not yet been
                received).
              </description>
            </enumeration>
            <enumeration value="Down"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="SessionExpiration" access="readWrite">
        <description>
          The duration in {{units}} in which the current Session Context will
          expire since the last session-related activity (e.g., Message sent or
          received, Session Context start or restart).

          A value of 0 means session expiration is disabled.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="0"/>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="SessionRetryMinimumWaitInterval" access="readWrite">
        <description>
          Configures the first retry wait interval, in {{units}}, as specified
          in {{bibref|TR-369|Section "Failure Handling in the Session
          Context"}}.

          A value of 5 corresponds to the default behavior that is described in
          {{bibref|TR-369}}.

          The USP Agent MUST use a random value between {{param}} and
          ({{param}} * {{param|SessionRetryIntervalMultiplier}} / 1000) as the
          first retry wait interval. Other values in the retry pattern MUST be
          calculated using this value as a starting point.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="1" maxInclusive="65535"/>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="5"/>
        </syntax>
      </parameter>

      <parameter name="SessionRetryIntervalMultiplier" access="readWrite">
        <description>
          Configures the retry interval multiplier as specified in
          {{bibref|TR-369|Section "Failure Handling in the Session Context"}}.

          This value is expressed in units of 0.001. Hence the values of the
          multiplier range between 1.000 and 65.535.

          A value of 2000 corresponds to the default behavior that is described
          in {{bibref|TR-369}}.

          The USP Agent MUST use a random value between
          {{param|SessionRetryMinimumWaitInterval}} and
          ({{param|SessionRetryMinimumWaitInterval}} * {{param}} / 1000) as the
          first retry wait interval. Other values in the retry pattern MUST be
          calculated using this value as a starting point.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="1000" maxInclusive="65535"/>
          </unsignedInt>
          <default type="object" value="2000"/>
        </syntax>
      </parameter>

      <parameter name="CurrentRetryCount" access="readOnly">
        <description>
          The current retry count of the Session Context. When zero (0), the
          Session Context is not in a retry state.
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="SegmentedPayloadChunkSize" access="readWrite"
          status="deleted">
        <description>
          The maximum size, in {{units}}, of the Record (payload(s) and
          headers) that can be transmitted to the remote endpoint. The smallest
          size, which can be configured is 512 bytes.

          A value of 0 means that the segmentation function is effectively
          disabled.

          {{deprecated|2.16|because it is replaced by
          {{param|MaxUSPRecordSize}}}}

          {{obsoleted|2.18}}

          {{deleted|2.19}}
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="0" maxInclusive="0"/>
            <range minInclusive="512"/>
            <units value="bytes"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="MaxUSPRecordSize" access="readWrite" version="2.16">
        <description>
          The maximum size allowed by the MTP, in {{units}}, a USP Record
          (payload(s) and header fields) that can be transmitted to the remote
          endpoint.

          When a size is set, a payload too large to transfer is segmented into
          smaller payloads according to the maximal size the USP Record can be.
          The smallest size, which can be configured, is 512 bytes.

          A value of 0 means that the segmentation function of payloads is
          effectively disabled.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="0" maxInclusive="0"/>
            <range minInclusive="512"/>
            <units value="bytes"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="MaxRetransmitTries" access="readWrite">
        <description>
          The maximum times that a USP Endpoint attempts to retransmit the
          requested USP Record to the remote endpoint.

          If the maximum tries is met for any requested USP Record, the USP
          Endpoint will restart the E2E Session.

          A value of -1 means that the USP Endpoint will always attempt to
          retransmit the requested USP Record.

          A value of 0 means that the USP Endpoint will not attempt to
          retransmit the requested USP Record and will restart the E2E Session.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1" maxInclusive="10"/>
          </int>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="PayloadSecurity" access="readWrite">
        <description>
          The security mechanism to use when exchanging the payload of the
          Record with the remote endpoint.
        </description>
        <syntax>
          <string>
            <enumeration value="Plaintext"/>
            <enumeration value="TLS">
              <description>
                The payload is encrypted at the originating endpoint and
                decrypted at the receiving endpoint using TLS.

                The procedures for using TLS in a Session Context is defined in
                {{bibref|TR-369}}.
              </description>
            </enumeration>
          </string>
          <default type="object" value="TLS"/>
        </syntax>
      </parameter>

      <command name="Reset()" async="false">
        <description>
          If the {{object}} is enabled then this command will either request to
          start or restart a Session Context with the remote endpoint.

          If the {{object}} is not enabled and there is an active Session
          Context then this command will terminate that Session Context with
          the remote endpoint.

          If the {{object}} is not enabled and there is no active Session
          Context then this command does nothing.
        </description>
      </command>
    </object>

    <object name="Device.LocalAgent.Subscription.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="SubscriptionNumberOfEntries"
        enableParameter="Enable" version="2.12">
      <description>
        A Subscription dictates how a USP Agent issues USP Notification
        Messages to a USP Controller, executes an automated configuration
        action, or both, as controlled by {{param|TriggerAction}}.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Recipient"/>
        <parameter ref="ID"/>
      </uniqueKey>

      <component ref="Alias" version="2.12"/>

      <parameter name="Enable" access="readWrite">
        <description>
          Enables/disables this {{object}}. A disabled entry MUST NOT be
          processed by the USP Agent.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="Recipient" access="readOnly">
        <description>
          {{reference|the {{object|#.Controller}} instance that will receive
          the Notification associated with this {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="#.Controller."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="TriggerAction" access="readWrite" version="2.16">
        <description>
          Determines the action to take when the monitored event occurs.
        </description>
        <syntax>
          <string>
            <enumeration value="Notify">
              <description>
                Issue a USP message to the controller configured in
                {{param|Recipient}}.
              </description>
            </enumeration>
            <enumeration value="Config">
              <description>
                Change the Device's configuration as detailed in
                {{param|TriggerConfigSettings}}.
              </description>
            </enumeration>
            <enumeration value="NotifyAndConfig">
              <description>
                Issue a USP message to the controller configured in
                {{param|Recipient}}, and change the Device's configuration as
                detailed in {{param|TriggerConfigSettings}}.
              </description>
            </enumeration>
          </string>
          <default type="object" value="Notify"/>
        </syntax>
      </parameter>

      <parameter name="TriggerConfigSettings" access="readWrite" version="2.16">
        <description>
          Each entry is a name-value pair representing the name of the data
          model parameter to configure and the value to configure it with.

          Each entry in the comma-separated list will use the following format:
          &lt;Parameter Name&gt;=&lt;Parameter Value&gt;

          The Parameter Value will be formatted per the value type, which means
          that string values will be quoted while unsignedInt values will be
          unquoted numeric values, etc..

          When the monitored event occurs, then the {{param}} will be executed
          if the {{param|TriggerAction}} is set to
          {{enum|Config|TriggerAction}} or
          {{enum|NotifyAndConfig|TriggerAction}}.
        </description>
        <syntax>
          <list maxItems="16"/>
          <string/>
        </syntax>
      </parameter>

      <parameter name="ID" access="readWrite">
        <description>
          Unique identifier of the {{object}} itself, which is specific to the
          USP Controller that creates the instance of the {{object}}.

          This value is used as the ''subscription_id'' element of every
          Notification message from a USP Agent to a USP Controller caused by
          this subscription entry.
        </description>
        <syntax>
          <string>
            <size minLength="1" maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="CreationDate" access="readOnly">
        <description>
          The date and time when this instance of {{object}} was created. This
          is internally used by the {{param|TimeToLive}} parameter to determine
          the expiration of this {{object}} instance.

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="NotifType" access="readWrite">
        <description>
          Type of Notification message that will be sent to the USP Controller
          specified by {{param|Recipient}} when this {{object}} is triggered.
        </description>
        <syntax>
          <string>
            <enumeration value="ValueChange"/>
            <enumeration value="ObjectCreation"/>
            <enumeration value="ObjectDeletion"/>
            <enumeration value="OperationComplete"/>
            <enumeration value="Event"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ReferenceList" access="readWrite" version="2.13">
        <description>
          Each entry in the list is a Path Name, Search Path, Command
          reference, or Event reference that determines the element(s) of the
          data model that the {{object}} is applicable to.

          Different values of the {{param|NotifType}} parameter will cause the
          {{object}} to interact with {{param}} differently. For example, an
          instance of {{object}} with {{enum|ValueChange|NotifType}} will
          utilize the value of this parameter differently than an instance with
          {{enum|Event|NotifType}}.

          Once the value of the {{param}} is written, the value cannot be
          changed as the {{object}} instance is considered to be immutable. If
          the value of a non-empty {{param}} parameter needs to change, the
          {{object}} instance MUST be deleted and a new {{object}} instance
          created.

          The following bullet points describe what is allowed as a value of
          {{param}} based on the different values of the {{param|NotifType}}
          parameter:

          * ValueChange: may be either a Path Name or Search Path; if an Object
            Path (one type of Path Name) then it is treated like a filter match
            such that all supported parameters in all objects below this point
            will be relevant for the subscription.

          * ObjectCreation: may be either a Path Name or Search Path as long as
            it only refers to a Multi-Instance Object; only the referenced
            Multi-Instance Objects will be relevant for the subscription.

          * ObjectDeletion: may be either a Path Name or Search Path as long as
            it only refers to instances of a Multi-Instance Object; only the
            referenced instances (wildcard references all instances over time)
            of the Multi-Instance Objects will be relevant for the
            subscription.

          * OperationComplete: may be either a Path Name, Search Path, or
            Command reference; if an Object Path (one type of Path Name) then
            it is treated like a filter match such that all supported data
            model commands in all objects below this point will be relevant for
            the subscription.

          * Event: may be either a Path Name, Search Path, or Event reference;
            if an Object Path (one type of Path Name) then it is treated like a
            filter match such that all supported Events in all objects below
            this point will be relevant for the subscription.
        </description>
        <syntax>
          <list/>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Persistent" access="readWrite">
        <description>
          Determines whether or not this {{object}} remains after the USP Agent
          is restarted (either via a reset of the software or reboot of the
          underlying device).

          If {{true}}, this {{object}} stays in existence until either a Delete
          message removes it or the {{param|TimeToLive}} parameter expires.

          If {{false}}, this {{object}} is automatically removed by the USP
          Agent whenever it is restarted.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="TimeToLive" access="readWrite">
        <description>
          Specifies the duration of time (in {{units}}) that this {{object}}
          remains in existence. After {{param}} has expired, this {{object}}
          instance is automatically removed by the USP Agent.

          If the value of {{param}} is 0, then this parameter is ignored and
          this {{object}} stays in existence until either a Delete message
          removes it or the {{param|Persistent}} parameter determines that it
          needs to be removed.

          If the value of {{param}} is greater than 0, then this parameter
          determines the length of time (from {{object}} creation) until it
          will be automatically removed by the USP Agent (unless the
          {{param|Persistent}} parameter is {{false}} and the USP Agent is
          restarted, in which case it will be removed before the {{param}}
          expiration). NOTE: This parameter does not count down as time moves
          forward; it will always read back with the same value that it was
          last set to.

          If the USP Agent is incapable of maintaining absolute time then
          {{param}} will automatically expire if the USP Agent is restarted
          (either via a reset of the software or reboot of the underlying
          device) before {{param}} expiration.
        </description>
        <syntax>
          <unsignedInt>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="NotifRetry" access="readWrite">
        <description>
          Specifies whether or not the USP Agent attempts to re-deliver the
          Notification in the event that it could not be delivered to the USP
          Controller.

          When {{param}} is {{true}}, the USP Agent MUST retry the delivery of
          the Notification. This implies that the Notification MUST be
          generated with the "send_resp" flag set to {{true}} such that the USP
          Agent knows when the Notification has been successfully delivered.
          The retry attempt(s) are performed using the retry algorithm defined
          in {{bibref|TR-369|Section "Responses to Notifications and
          Notification Retry"}}.

          When {{param}} is {{false}}, the USP Agent MUST NOT retry the
          delivery of the Notification, and SHOULD generate the notification
          with "send_resp" flag set to {{false}}.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="NotifExpiration" access="readWrite">
        <description>
          Specifies the duration of time (in {{units}}) that the Notification
          associated with this {{object}} will continue to be retried. After
          {{param}} has expired, if the Notification has still not been
          successfully delivered then the USP Agent MUST stop attempting to
          re-deliver the Notification.

          If {{param|NotifRetry}} is set to {{false}} then this parameter is
          ignored.

          If {{param|NotifRetry}} is set to {{true}} and the value of {{param}}
          is 0, then the USP Agent will attempt to re-deliver the Notification
          until it has been successfully delivered or until the USP Agent is
          restarted (either via a reset of the software or reboot of the
          underlying device).

          If {{param|NotifRetry}} is set to {{true}} and the value of {{param}}
          is greater than 0, then the USP Agent will attempt to re-deliver the
          Notification until either it has been successfully delivered, until
          the length of time (from the time the Notification was initially
          attempted to be delivered) specified in this parameter expires, or
          until the USP Agent is restarted (either via a reset of the software
          or reboot of the underlying device).

          NOTE: This parameter does not count down as time moves forward; it
          will always read back with the same value that it was last set to.
        </description>
        <syntax>
          <unsignedInt>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>
    </object>

    <object name="Device.LocalAgent.Request.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="RequestNumberOfEntries" version="2.12">
      <description>
        {{object}} instances are created using USP ''Operate'' messages. Only
        ''Operate'' messages with ''async''=''true'' will create a {{object}}
        instance in the data model.

        New instances of {{object}} are created with {{param|Status}} as
        {{enum|Requested|Status}}. Once the command of the ''Operate'' begins
        to be executed, then the the {{param|Status}} changes to
        {{enum|Active|Status}}.

        When the command of the ''Operate'' completes, then this {{object}}
        instance is removed from this table, but not before the
        {{param|Status}} transitions to either {{enum|Success|Status}} or
        {{enum|Error|Status}} depending on whether the command of the
        ''Operate'' completed successfully or not.
      </description>
      <uniqueKey functional="true">
        <parameter ref="Originator"/>
        <parameter ref="Command"/>
        <parameter ref="CommandKey"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <component ref="Alias" version="2.12"/>

      <parameter name="Originator" access="readOnly">
        <description>
          The USP Endpoint Identifier that originated the command.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="Command" access="readOnly">
        <description>
          The command to be executed. This parameter is a Path Name that
          addresses a Command in an Object or Object Instance.

          The command is a result of the evaluation of the ''command'' argument
          of an ''Operate'' message.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="CommandKey" access="readOnly">
        <description>
          The ''command_key'' from the USP ''Operate'' message.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="Status" access="readOnly">
        <description>
          The operational status of the request to execute the command.
        </description>
        <syntax>
          <string>
            <enumeration value="Requested">
              <description>
                The command has been requested but is currently not executing.
              </description>
            </enumeration>
            <enumeration value="Active">
              <description>The command is currently executing.</description>
            </enumeration>
            <enumeration value="Canceling">
              <description>
                The command has been requested to be canceled.
              </description>
            </enumeration>
            <enumeration value="Canceled">
              <description>
                The command has successfully been canceled.
              </description>
            </enumeration>
            <enumeration value="Success">
              <description>
                The command has successfully been completed its execution.
              </description>
            </enumeration>
            <enumeration value="Error">
              <description>
                The command has unsuccessfully completed its execution or has
                unsuccessfully been canceled.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <command name="Cancel()" async="false">
        <description>
          Request cancelation of this {{object}}'s command.

          This command completes immediately. If successful, {{param|Status}}
          will immediately change to {{enum|Canceling|Status}} and will change
          to {{enum|Canceled|Status}} when the cancelation is complete.
        </description>
      </command>
    </object>

    <object base="Device.LocalAgent.Certificate.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="CertificateNumberOfEntries">

      <command name="Delete()" async="false">
        <description>
          This command is issued to allow a Controller (with the proper
          permissions) to delete an entry from the
          {{object|##.Certificate.{i}}}. It also removes references to the
          Certificate in {{param|##.LocalAgent.Controller.{i}.Credential}} or
          {{param|##.LocalAgent.ControllerTrust.Credential.{i}.Credential}} and
          removes any X.509 certificate data the Agent had stored related to
          the entry.
        </description>
      </command>

      <command name="GetFingerprint()" async="false">
        <description>
          This command is issued to allow a Controller to request the value of
          a fingerprint calculated for the specified table entry using the
          input {{param|FingerprintAlgorithm}}.
        </description>
        <input>

          <parameter name="FingerprintAlgorithm" mandatory="true">
            <description>
              The algorithm to be used to calculate the requested fingerprint.
              The value MUST be one the Agent supports, as noted in
              {{param|###.SupportedFingerprintAlgorithms}}.
            </description>
            <syntax>
              <string>
                <enumeration value="SHA-1">
                  <description>
                    As specified in {{bibref|RFC3174}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-224">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-256">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-384">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-512">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>
        </input>
        <output>

          <parameter name="Fingerprint">
            <description>
              The value of the fingerprint.
            </description>
            <syntax>
              <hexBinary>
                <size maxLength="128"/>
              </hexBinary>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object base="Device.LocalAgent.ControllerTrust." access="readOnly"
        minEntries="1" maxEntries="1">

      <command name="RequestChallenge()" async="false"
          dmr:previousParameter="TOFUInactivityTimer">
        <description>
          This command is issued to retrieve the instruction for the referenced
          challenge.

          There is at most one (1) outstanding RequestChallenge for a
          requesting Controller.

          As such, any new challenges with a different value of the
          {{param|ChallengeRef}} parameter are denied until a successful
          response to the outstanding challenge is received by the Agent or the
          current RequestChallenge expires.

          When the value of the {{param|ChallengeRef}} parameter defined in the
          RequestChallenge does not exist, the Agent returns an "Invalid Value"
          error.
        </description>
        <input>

          <parameter name="ChallengeRef" mandatory="true">
            <description>
              {{reference|the {{object|#.Challenge}} object instance for this
              request}}
            </description>
            <syntax>
              <string>
                <pathRef refType="weak" targetParent="#.Challenge."
                    targetType="row"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="RequestExpiration">
            <description>
              The expiration period, in {{units}}, where the Controller request
              that this challenge request expire (times-out).

              A value of zero indicates that the challenge request will never
              expire. The default is 900 {{units}}.
            </description>
            <syntax>
              <int>
                <range minInclusive="0"/>
                <units value="seconds"/>
              </int>
            </syntax>
          </parameter>
        </input>
        <output>

          <parameter name="Instruction">
            <description>
              The value of the {{param|##.Challenge.{i}.Instruction}} parameter
              associated with the requested challenge in the
              {{param|#.Input.ChallengeRef}} parameter.
            </description>
            <syntax>
              <base64/>
            </syntax>
          </parameter>

          <parameter name="InstructionType">
            <description>
              The media type with a format as defined by {{bibref|RFC6838}} of
              the content of the {{param|Instruction}} parameter.

              The allowable values of the media type are defined by the
              {{param|##.Challenge.{i}.InstructionType}} parameter.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>

          <parameter name="ValueType">
            <description>
              The media type with a format as defined by {{bibref|RFC6838}} of
              the content of the {{param|##.Challenge.{i}.Value}} parameter.

              The allowable values of the media type are defined by the
              {{param|##.Challenge.{i}.ValueType}} parameter.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>

          <parameter name="ChallengeID">
            <description>
              The challenge identifier the Controller uses in the
              ChallengeResponse command to correlate this request with a
              response.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>
        </output>
      </command>

      <command name="ChallengeResponse()" async="false">
        <description>
          This command is issued to return the response of challenge.
        </description>
        <input>

          <parameter name="ChallengeID" mandatory="true">
            <description>
              The challenge identifier the Controller uses to correlate the
              challenge request with a response.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>

          <parameter name="Value" mandatory="true">
            <description>
              The value of the challenge that is specific to the type of
              challenge. The challenge value is provided by the external party
              to the Controller.
            </description>
            <syntax>
              <base64/>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>

    <object name="Device.Standby." access="readOnly" minEntries="1"
        maxEntries="1" version="2.12">
      <description>
        Capabilities of a Device as it pertains to entering a standby state.
      </description>

      <parameter name="NetworkAware" access="readOnly">
        <description>
          Indicates that the device is capable of maintaining a network
          connection and responding to communications via the network
          connection while in a standby state.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="TimerAware" access="readOnly">
        <description>
          Indicates that the device is capable of maintaining and responding to
          timers while in a standby state.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>
    </object>

    <component ref="CollectionDeviceUSP"/>

    <object name="Device.ProxiedDevice.{i}." access="readOnly" minEntries="0"
        maxEntries="unbounded" mountType="mountPoint"
        numEntriesParameter="ProxiedDeviceNumberOfEntries" version="2.12">
      <description>
        Each entry in the table is a ProxiedDevice object that is a mount
        point. Each ProxiedDevice represents distinct hardware Devices.
        ProxiedDevice objects are virtual and abstracted representation of
        functionality, that exists on hardware other than that which the Agent
        is running.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <component ref="Alias" version="2.12"/>
      <component ref="IoT_ProxiedDeviceExtensionComponent"/>
      <component ref="IoT_NodeComponent"/>
    </object>
    <!-- IoT specific objects -->

    <object base="Device.DeviceInfo.FirmwareImage.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded">

      <command name="Download()" async="true" version="2.12">
        <description>
          This command is issued to download a firmware into this Firmware
          Image instance.

          All results of the actual download will be contained within the
          {{event|##.LocalAgent.TransferComplete!}} event.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} specifying the source file location. The HTTPS
              transport MUST be supported, and the HTTP transport MAY be
              supported.

              If the Agent receives multiple download requests with the same
              source URL, the Agent MUST perform each download as requested,
              and MUST NOT assume that the content of the file to be downloaded
              is the same each time.

              This URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="AutoActivate" mandatory="true">
            <description>
              If {{true}} the Agent MUST automatically activate the firmware
              once it is successfully downloaded.

              If {{false}} the Agent MUST NOT activate the firmware until
              explicitly instructed to do so by either invoking
              {{command|#.Activate()}} or setting
              {{param|##.BootFirmwareImage}} and rebooting the Agent.
            </description>
            <syntax>
              <boolean/>
            </syntax>
          </parameter>

          <parameter name="Username">
            <description>
              Username to be used by the Agent to authenticate with the file
              server. This argument is omitted if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Password">
            <description>
              Password to be used by the Agent to authenticate with the file
              server. This argument is omitted if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="FileSize">
            <description>
              The size of the file to be downloaded in bytes.

              The FileSize argument is intended as a hint to the Agent, which
              the Agent MAY use to determine if it has sufficient space for the
              file to be downloaded, or to prepare space to accept the file.

              The Controller MAY set this value to zero. The Agent MUST
              interpret a zero value to mean that that the Controller has
              provided no information about the file size. In this case, the
              Agent MUST attempt to proceed with the download under the
              presumption that sufficient space is available, though during the
              course of download, the Agent might determine otherwise.

              The Controller SHOULD set the value of this Parameter to the
              exact size of the file to be downloaded. If the value is
              non-zero, the Agent MAY reject the ScheduleDownload request on
              the basis of insufficient space.

              If the Agent attempts to proceed with the download based on the
              value of this argument, but the actual file size differs from the
              value of this argument, this could result in a failure of the
              download. However, the Agent MUST NOT cause the download to fail
              solely because it determines that the value of this argument is
              inaccurate.
            </description>
            <syntax>
              <unsignedInt/>
            </syntax>
          </parameter>

          <parameter name="CheckSumAlgorithm">
            <description>
              The hash algorithm to use when performing a checksum validation
              of the downloaded file.

              If the {{param|CheckSum}} input argument is specified, the Agent
              MUST validate the integrity of the downloaded file by comparing
              the value contained in the {{param|CheckSum}} input argument
              against a hash of the downloaded file.
            </description>
            <syntax>
              <string>
                <enumeration value="SHA-1">
                  <description>
                    As specified in {{bibref|RFC3174}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-224">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-256">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-384">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-512">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>

          <parameter name="CheckSum">
            <description>
              The hash value of the downloaded file used to validate the
              integrity of the downloaded file.

              If this argument is specified, the Agent MUST validate the
              integrity of the downloaded file by comparing the provided value
              against a hash of the downloaded file using the hashing algorithm
              specified in the {{param|CheckSumAlgorithm}} input argument.

              If this argument is {{empty}}, the Agent MUST NOT perform a
              checksum validation of the downloaded file.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="Activate()" async="true" version="2.12">
        <description>
          This command is issued to activate this {{object}} instance.

          A {{object}} instance can also be activated by setting the
          {{param|#.BootFirmwareImage}} parameter and causing the Agent to
          reboot.

          A successful activation will result in a reboot of the device with
          this {{object}} as the currently running firmware image. Furthermore,
          this {{object}} will be referenced by the
          {{param|#.ActiveFirmwareImage}} parameter.

          A failed activation will result in this {{object}} instance's
          {{param|BootFailureLog}} being updated.
        </description>
        <input>

          <object name="TimeWindow.{i}." minEntries="1" maxEntries="5">
            <description>
              The time window(s) that dictate when the Agent activates the
              firmware image.

              An Agent MUST be able to accept a request with either one or two
              {{object}} instances.

              The time windows MUST NOT overlap, i.e. if there are two time
              windows, the second window’s Start value has to be greater than
              or equal to the first window’s End value.
            </description>

            <parameter name="Start" mandatory="true">
              <description>
                Start of this time window as an offset in {{units}} after
                invoking the command. An offset is used in order to avoid a
                dependence on absolute time.
              </description>
              <syntax>
                <unsignedInt>
                  <units value="seconds"/>
                </unsignedInt>
              </syntax>
            </parameter>

            <parameter name="End" mandatory="true">
              <description>
                End of this time window as an offset in {{units}} after
                invoking the command. An offset is used in order to avoid a
                dependence on absolute time.
              </description>
              <syntax>
                <unsignedInt>
                  <units value="seconds"/>
                </unsignedInt>
              </syntax>
            </parameter>

            <parameter name="Mode" mandatory="true">
              <description>
                Specifies when within this time window the Agent is permitted
                to activate the specified firmware image.
              </description>
              <syntax>
                <string>
                  <enumeration value="AnyTime">
                    <description>
                      The Agent MAY activate the firmware image at any time
                      during the time window even if this results in
                      interruption of service for the subscriber.
                    </description>
                  </enumeration>
                  <enumeration value="Immediately">
                    <description>
                      The Agent MUST activate the firmware image immediately at
                      the start of the time window even if this results in
                      interruption of service for the subscriber.
                    </description>
                  </enumeration>
                  <enumeration value="WhenIdle">
                    <description>
                      The Agent MUST NOT cause an interruption of service from
                      the subscriber's standpoint while activating the firmware
                      image during the time window.

                      How the Agent determines this is outside the scope of
                      this specification.
                    </description>
                  </enumeration>
                  <enumeration value="ConfirmationNeeded">
                    <description>
                      The Agent MUST ask for and receive confirmation before
                      activating the firmware image.

                      It is outside the scope of this specification how the
                      Agent asks for and receives this confirmation.

                      If confirmation is not received, this time window MUST
                      NOT be used.
                    </description>
                  </enumeration>
                </string>
              </syntax>
            </parameter>

            <parameter name="UserMessage">
              <description>
                A message that informs the user of a request to activate a new
                firmware image.

                The Agent MAY use this message when seeking confirmation from
                the user, e.g. when {{param|Mode}} is
                {{enum|ConfirmationNeeded|Mode}}.

                When there is no need for such a message, it SHOULD be
                {{empty}} and MUST be ignored.
              </description>
              <syntax>
                <string/>
              </syntax>
            </parameter>

            <parameter name="MaxRetries">
              <description>
                The maximum number of retries for activating the firmware image
                before regarding the transfer as having failed. Refers only to
                this time window (each time window can specify its own value).

                A value of 0 means “No retries are permitted”. A value of -1
                means “the Agent determines the number of retries”, i.e. that
                the Agent can use its own retry policy, not that it has to
                retry forever.

                Only applicable when the {{param|Mode}} input argument is
                {{enum|ConfirmationNeeded|Mode}}, otherwise this input argument
                MUST be ignored.
              </description>
              <syntax>
                <int>
                  <range minInclusive="-1" maxInclusive="10"/>
                </int>
              </syntax>
            </parameter>
          </object>
        </input>
      </command>
    </object>

    <object base="Device.DeviceInfo.VendorLogFile.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded">

      <command name="Upload()" async="true" version="2.12">
        <description>
          This command is issued to upload the log file specified by this
          Vendor Log File instance.

          All results of the actual upload will be contained within the
          {{event|##.LocalAgent.TransferComplete!}} event.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} specifying the destination file location. The
              HTTPS transport MUST be supported, and the HTTP transport MAY be
              supported.

              This argument specifies only the destination file location, and
              does not indicate in any way the name or location of the local
              file to be uploaded.

              If the Agent receives multiple upload requests with the same URL,
              the Agent MUST perform each upload as requested, and MUST NOT
              assume that the content of the file to be uploaded is the same
              each time.

              This URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="Username" mandatory="true">
            <description>
              Username to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Password" mandatory="true">
            <description>
              Password to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>

    <object base="Device.DeviceInfo.VendorConfigFile.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded">

      <command name="Backup()" async="true" version="2.12">
        <description>
          This command is issued to upload the configuration file specified by
          this {{object}} instance.

          All results of the actual upload will be contained within the
          {{event|##.LocalAgent.TransferComplete!}} event.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} specifying the destination file location. The
              HTTPS transport MUST be supported, and the HTTP transport MAY be
              supported.

              This argument specifies only the destination file location, and
              does not indicate in any way the name or location of the local
              file to be uploaded.

              If the Agent receives multiple upload requests with the same URL,
              the Agent MUST perform each upload as requested, and MUST NOT
              assume that the content of the file to be uploaded is the same
              each time.

              This URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="Username" mandatory="true">
            <description>
              Username to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Password" mandatory="true">
            <description>
              Password to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="Restore()" async="true" version="2.12">
        <description>
          This command is issued to download a configuration file into this
          {{object}} instance.

          All results of the actual download will be contained within the
          {{event|##.LocalAgent.TransferComplete!}} event.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} specifying the source file location. The HTTPS
              transport MUST be supported, and the HTTP transport MAY be
              supported.

              If the Agent receives multiple download requests with the same
              source URL, the Agent MUST perform each download as requested,
              and MUST NOT assume that the content of the file to be downloaded
              is the same each time.

              This URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="Username" mandatory="true">
            <description>
              Username to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Password" mandatory="true">
            <description>
              Password to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="FileSize">
            <description>
              The size of the file to be downloaded in bytes.

              The FileSize argument is intended as a hint to the Agent, which
              the Agent MAY use to determine if it has sufficient space for the
              file to be downloaded, or to prepare space to accept the file.

              The Controller MAY set this value to zero. The Agent MUST
              interpret a zero value to mean that that the Controller has
              provided no information about the file size. In this case, the
              Agent MUST attempt to proceed with the download under the
              presumption that sufficient space is available, though during the
              course of download, the Agent might determine otherwise.

              The Controller SHOULD set the value of this Parameter to the
              exact size of the file to be downloaded. If the value is
              non-zero, the Agent MAY reject the ScheduleDownload request on
              the basis of insufficient space.

              If the Agent attempts to proceed with the download based on the
              value of this argument, but the actual file size differs from the
              value of this argument, this could result in a failure of the
              download. However, the Agent MUST NOT cause the download to fail
              solely because it determines that the value of this argument is
              inaccurate.
            </description>
            <syntax>
              <unsignedInt/>
            </syntax>
          </parameter>

          <parameter name="TargetFileName">
            <description>
              The name of the file to be used on the target file system. This
              argument MAY be {{empty}} if the target file name can be
              extracted from the downloaded file itself, or from the URL
              argument, or if no target file name is needed.

              If this argument is specified, but the target file name is also
              indicated by another source (for example, if it is extracted from
              the downloaded file itself), this argument MUST be ignored.

              If the target file name is used, the downloaded file would
              replace any existing file of the same name (whether or not the
              Agent archives the replaced file is a local matter).

              If present, this Parameter is treated as an opaque string with no
              specific requirements for its format. That is, the TargetFileName
              value is to be interpreted based on the Agent's vendor-specific
              file naming conventions.

              Note that this specification does not preclude the use of a file
              naming convention in which the file’s path can be specified as
              part of the file name.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="CheckSumAlgorithm">
            <description>
              The hash algorithm to use when performing a checksum validation
              of the downloaded file.

              If the {{param|CheckSum}} input argument is specified, the Agent
              MUST validate the integrity of the downloaded file by comparing
              the value contained in the {{param|CheckSum}} input argument
              against a hash of the downloaded file.
            </description>
            <syntax>
              <string>
                <enumeration value="SHA-1">
                  <description>
                    As specified in {{bibref|RFC3174}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-224">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-256">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-384">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-512">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>

          <parameter name="CheckSum">
            <description>
              The hash value of the downloaded file used to validate the
              integrity of the downloaded file.

              If this argument is specified, the Agent MUST validate the
              integrity of the downloaded file by comparing the provided value
              against a hash of the downloaded file using the hashing algorithm
              specified in the {{param|CheckSumAlgorithm}} input argument.

              If this argument is {{empty}}, the Agent MUST NOT perform a
              checksum validation of the downloaded file.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>
    <!-- Diagnostics Commands from common model -->

    <object base="Device.DSL.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="ADSLLineTest()" async="true" version="2.12">
        <description>
          This command is to provide diagnostic information for a CPE with an
          ADSL2 or ADSL2+ modem WAN interface, but MAY also be used for ADSL.
        </description>
        <input>
          <component ref="ADSLLineDiagnosticsInput" version="2.12"/>

          <parameter base="Interface" mandatory="true"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="ADSLLineDiagnosticsOutput" version="2.12"/>
        </output>
      </command>

      <command name="SELTUER()" async="true" version="2.13">
        <description>
          This command performs a DSL Single Ended Line Test - Physical Medium
          Dependent (SELT-PMD) Uncalibrated Echo Response (UER).

          This command is for the CPE, aka the Transmission Unit - Remote end
          (TU-R).

          Reference: ITU-T Recommendation {{bibref|G.996.2|Clause A.2, SELT-PMD
          management entity}}.
        </description>
        <input>
          <component ref="SELTUERDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="SELTUERDiagnosticsOutput"/>
        </output>
      </command>

      <command name="SELTQLN()" async="true" version="2.13">
        <description>
          This command performs a DSL Single Ended Line Test - Physical Medium
          Dependent (SELT-PMD) Quiet Line Noise (QLN).

          This command is for the CPE, aka the Transmission Unit - Remote end
          (TU-R).

          Reference: ITU-T Recommendation {{bibref|G.996.2|Clause A.2, SELT-PMD
          management entity}}.
        </description>
        <input>
          <component ref="SELTQLNDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="SELTQLNDiagnosticsOutput"/>
        </output>
      </command>

      <command name="SELTP()" async="true" version="2.13">
        <description>
          This command performs a DSL Single-Ended Line Test - Processed
          (SELT-P).

          This command is for the CPE, aka the Transmission Unit - Remote end
          (TU-R).

          Reference: ITU-T Recommendation {{bibref|G.996.2}}.
        </description>
        <input>
          <component ref="SELTPDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="SELTPDiagnosticsOutput"/>
        </output>
      </command>
    </object>

    <object base="Device.ATM." access="readOnly" minEntries="1" maxEntries="1">
      <description action="replace">
        Asynchronous Transfer Mode (ATM) object that contains the
        {{object|Link}} interface and {{command|Diagnostics.F5Loopback()}}
        diagnostics.
      </description>
    </object>

    <object base="Device.ATM.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="F5Loopback()" async="true" version="2.12">
        <description>
          This command provides access to an ATM-layer F5 OAM loopback test.
        </description>
        <input>
          <component ref="ATMF5LoopbackDiagnosticsInput" version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="ATMF5LoopbackDiagnosticsOutput" version="2.12"/>
        </output>
      </command>
    </object>

    <object base="Device.HPNA.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="PHYThroughput()" async="true" version="2.12">
        <description>
          HPNA PHY throughput diagnostics configuration and results.

          When diagnostics are requested, all HPNA nodes for which the
          {{param|#.Interface.{i}.AssociatedDevice.{i}.PHYDiagnosticsEnable}}
          parameter is set enter PHY diagnostics mode.
        </description>
        <input>
          <component ref="HPNAPHYThroughputDiagnosticsInput" version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_FailToEnableCert"/>
                <enumeration value="Error_CertCmdTimeout"/>
                <enumeration value="Error_UnknownErr"/>
                <enumeration value="Error_UnsupportedOpcode"/>
                <enumeration value="Error_InvalidParam"/>
                <enumeration value="Error_UnsupportedCmdSegment"/>
                <enumeration value="Error_UnsupportedDataGen"/>
                <enumeration value="Error_InvalidSequence"/>
                <enumeration value="Error_InvalidFrame"/>
                <enumeration value="Eror_InvalidOpcode"/>
              </string>
            </syntax>
          </parameter>
          <component ref="HPNAPHYThroughputDiagnosticsOutput" version="2.12"/>
        </output>
      </command>

      <command name="PerformanceMonitoring()" async="true" version="2.12">
        <description>
          HPNA performance monitoring configuration and results.

          Performance monitoring results are sampled from all nodes in the HPNA
          network. All packet related counters are sampled synchronized at all
          nodes in the HPNA network in order to derive packet loss calculations
          in the HPNA network.
        </description>
        <input>
          <component ref="HPNAPerformanceMonitoringDiagnosticsInput"
              version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_SampleIntervalTooSmall"/>
              </string>
            </syntax>
          </parameter>
          <component ref="HPNAPerformanceMonitoringDiagnosticsOutput"
              version="2.12"/>
        </output>
      </command>
    </object>

    <object base="Device.Ghn.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="PHYThroughput()" async="true" version="2.12">
        <description>
          G.hn PHY throughput diagnostics configuration and results.

          When diagnostics are requested, all G.hn nodes for which the
          {{param|#.Interface.{i}.PHYThroughputDiagnosticsEnable}} parameter is
          set enter PHY diagnostics mode.
        </description>
        <input>
          <component ref="GhnPHYThroughputDiagnosticsInput" version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="GhnPHYThroughputDiagnosticsOutput" version="2.12"/>
        </output>
      </command>

      <command name="PerformanceMonitoring()" async="true" version="2.12">
        <description>
          G.hn Performance Monitoring diagnostics configuration and results.

          When diagnostics are requested, all G.hn nodes for which the
          {{param|#.Interface.{i}.PerformanceMonitoringDiagnosticsEnable}}
          parameter is set enter PHY diagnostics mode.
        </description>
        <input>
          <component ref="GhnPerformanceMonitoringDiagnosticsInput"
              version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="GhnPerformanceMonitoringDiagnosticsOutput"
              version="2.12"/>
        </output>
      </command>
    </object>

    <object base="Device.UPA.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="InterfaceMeasurement()" async="true" version="2.12">
        <description>
          This command provides access to either a Signal-to-Noise-Ratio (SNR)
          Port Measurement test or a Channel Frequency Response (CFR) Port
          Measurement test. The {{param|Type}} parameter is used to select
          which type of test to perform.

          CFR and SNR measurements are done between a two UPA devices (a local
          interface and a remote device belonging to the same network).
        </description>
        <input>
          <component ref="UPAInterfaceMeasurementDiagnosticsInput"
              version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_InvalidPort"/>
              </string>
            </syntax>
          </parameter>
          <component ref="UPAInterfaceMeasurementDiagnosticsOutput"
              version="2.12"/>
        </output>
      </command>
    </object>

    <object base="Device.IP.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="IPPing()" async="true" version="2.12">
        <description>
          This command provides access to an IP-layer ping test.
        </description>
        <input>
          <component ref="IPPingDiagnosticsInput" version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost">
                  <description>
                    The CPE can not reach the requested Ping host address
                  </description>
                </enumeration>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPPingDiagnosticsOutput" version="2.12"/>

          <parameter base="IPAddressUsed">
            <description action="replace">
              Indicates which IP address was used to send the Ping request.
            </description>
          </parameter>
        </output>
      </command>

      <command name="TraceRoute()" async="true" version="2.12">
        <description>
          This command defines access to an IP-layer trace-route test for the
          specified IP interface.
        </description>
        <input>
          <component ref="IPTraceRouteDiagnosticsInput" version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost">
                  <description>
                    The CPE can not reach the requested TraceRoute host address
                  </description>
                </enumeration>
                <enumeration value="Error_MaxHopCountExceeded"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPTraceRouteDiagnosticsOutput" version="2.12"/>

          <parameter base="IPAddressUsed">
            <description action="replace">
              Indicates which IP address was used for TraceRoute.
            </description>
          </parameter>
        </output>
      </command>
      <component ref="IPDownloadDiagnosticsCapabilities"/>

      <parameter base="DownloadDiagnosticsMaxIncrementalResult"
          access="readOnly">
        <description action="replace">
          The maximum number of instances in
          {{object|DownloadDiagnostics().IncrementalResult}} that the
          implementation will return.
        </description>
      </parameter>

      <command name="DownloadDiagnostics()" async="true" version="2.12">
        <description>
          This command defines the diagnostics configuration for a HTTP and FTP
          DownloadDiagnostics Test.

          Files received in the DownloadDiagnostics do not require file storage
          on the CPE device.
        </description>
        <input>
          <component ref="IPDownloadDiagnosticsInput" version="2.12"/>
          <component ref="IPDownloadDiagnosticsInput2" version="2.12"/>

          <parameter base="NumberOfConnections">
            <description action="replace">
              The number of connections to be used in the test. The default
              value SHOULD be 1. {{param}} MUST NOT be set to a value greater
              than {{param|#.DownloadDiagnosticMaxConnections}}.
            </description>
            <syntax>
              <unsignedInt>
                <range minInclusive="1"/>
              </unsignedInt>
            </syntax>
          </parameter>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost"/>
                <enumeration value="Error_InitConnectionFailed"/>
                <enumeration value="Error_NoResponse"/>
                <enumeration value="Error_TransferFailed"/>
                <enumeration value="Error_PasswordRequestFailed"/>
                <enumeration value="Error_LoginFailed"/>
                <enumeration value="Error_NoTransferMode"/>
                <enumeration value="Error_NoPASV"/>
                <enumeration value="Error_IncorrectSize"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPDownloadDiagnosticsOutput" version="2.12"/>

          <object base="PerConnectionResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              Results for individual connections. This table is only populated
              when {{param|#.EnablePerConnectionResults}} is {{true}}. A new
              object is created for each connection specified in
              {{param|#.NumberOfConnections}}. Instance numbers MUST start at 1
              and sequentially increment as new instances are created.
            </description>
          </object>

          <object base="IncrementalResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              Results for time segmented tests (tests where
              {{param|#.TimeBasedTestDuration}} &gt; 0 and
              {{param|#.TimeBasedTestMeasurementInterval}} &gt; 0). This data
              is totaled across all connections in the test. A new object is
              created every {{param|#.TimeBasedTestMeasurementInterval}} after
              that interval has completed. Instance numbers MUST start at 1 and
              sequentially increment as new instances are created.
            </description>
          </object>
        </output>
      </command>
      <component ref="IPUploadDiagnosticsCapabilities"/>

      <parameter base="UploadDiagnosticsMaxIncrementalResult"
          access="readOnly">
        <description action="replace">
          The maximum number of instances in
          {{object|UploadDiagnostics().IncrementalResult}} that the
          implementation will return.
        </description>
      </parameter>

      <command name="UploadDiagnostics()" async="true" version="2.12">
        <description>
          This command defines the diagnostics configuration for a HTTP or FTP
          UploadDiagnostics test.

          Files sent by the UploadDiagnostics do not require file storage on
          the CPE device, and MAY be an arbitrary stream of bytes.
        </description>
        <input>
          <component ref="IPUploadDiagnosticsInput" version="2.12"/>
          <component ref="IPUploadDiagnosticsInput2" version="2.12"/>

          <parameter base="NumberOfConnections">
            <description action="replace">
              The number of connections to be used in the test. The default
              value SHOULD be 1. {{param}} MUST NOT be set to a value greater
              than {{param|#.UploadDiagnosticsMaxConnections}}.
            </description>
          </parameter>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost"/>
                <enumeration value="Error_InitConnectionFailed"/>
                <enumeration value="Error_NoResponse"/>
                <enumeration value="Error_PasswordRequestFailed"/>
                <enumeration value="Error_LoginFailed"/>
                <enumeration value="Error_NoTransferMode"/>
                <enumeration value="Error_NoPASV"/>
                <enumeration value="Error_NoCWD"/>
                <enumeration value="Error_NoSTOR"/>
                <enumeration value="Error_NoTransferComplete"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPUploadDiagnosticsOutput" version="2.12"/>

          <object base="PerConnectionResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              Results for individual connections. This table is only populated
              when {{param|#.EnablePerConnectionResults}} is {{true}}. A new
              object is created for each connection specified in
              {{param|#.NumberOfConnections}}. Instance numbers MUST start at 1
              and sequentially increment as new instances are created.
            </description>
          </object>

          <object base="IncrementalResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              Results for time segmented tests (tests where
              {{param|#.TimeBasedTestDuration}} &gt; 0 and
              {{param|#.TimeBasedTestMeasurementInterval}} &gt; 0). This data
              is totaled across all connections in the test. A new object is
              created every {{param|#.TimeBasedTestMeasurementInterval}} after
              that interval has completed. Instance numbers MUST start at 1 and
              sequentially increment as new instances are created.
            </description>
          </object>
        </output>
      </command>
      <component ref="IPUDPEchoDiagnosticsCapabilities"/>

      <parameter base="UDPEchoDiagnosticsMaxResults" access="readOnly">
        <description action="replace">
          The maximum number of rows in
          {{object|UDPEchoDiagnostics().IndividualPacketResult}} that the CPE
          will store. If a test would create more rows than {{param}} only the
          first {{param}} rows are present in
          {{object|UDPEchoDiagnostics().IndividualPacketResult}}.
        </description>
      </parameter>

      <command name="UDPEchoDiagnostics()" async="true" version="2.12">
        <description>
          This command defines the diagnostics configuration for a UDP Echo
          test {{bibref|TR-143|Appendix A.1}} defined in {{bibref|RFC862}} or a
          UDP Echo Plus test defined in {{bibref|TR-143|Appendix A.1}}.
        </description>
        <input>
          <component ref="IPUDPEchoDiagnosticsInput" version="2.12"/>
          <component ref="IPUDPEchoDiagnosticsInput2" version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPUDPEchoDiagnosticsOutput" version="2.12"/>

          <object base="IndividualPacketResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              This object provides the results from individual UDPEchoPlus test
              packets collected during a test if
              {{param|#.EnableIndividualPacketResults}} is set to true. It
              should contain {{param|#.NumberOfRepetitions}} objects. Instance
              numbers MUST start at 1 and sequentially increment as new
              instances are created. The instance number should match the
              TestIterationNumber field of the request and response packet.
            </description>
          </object>
        </output>
      </command>
      <component ref="IPLayerCapacityCapabilities"/>

      <parameter base="IPLayerMaxIncrementalResult" access="readOnly">
        <description action="replace">
          The maximum number of instances in
          {{object|IPLayerCapacity().IncrementalResult}} that the
          implementation will return.
        </description>
      </parameter>

      <command name="IPLayerCapacity()" async="true" version="2.14">
        <description>
          This command defines the IP Layer Capacity measurement configuration.
          IP Layer Capacity measurement is specified in {{bibref|TR-471}}.

          Data received in the IP Layer Capacity measurement do not require
          storage on the device.

          If {{param|AuthenticationEnabled}} is set to {{true}}, one of the
          following combinations of {{param|AuthenticationCode}},
          {{param|AuthenticationAlias}} and
          {{param|AuthenticationKeyFileLocation}} MUST be met. Otherwise, the
          client returns an error.

          If only {{param|AuthenticationCode}} is provided, the client uses
          the value directly as the key.

          If both {{param|AuthenticationCode}} and
          {{param|AuthenticationAlias}} are provided but
          {{param|AuthenticationKeyFileLocation}} is not provided, the client
          uses the {{param|AuthenticationCode}} as the key and the
          {{param|AuthenticationAlias}} as key ID. The
          {{object|IPLayerCapacityAuthCode}} table is ignored.

          If only {{param|AuthenticationAlias}} is provided, the client uses
          the {{object|IPLayerCapacityAuthCode}} table to derive the
          {{param|IPLayerCapacityAuthCode.{i}.Alias}} to use as key ID,
          and the
          {{param|IPLayerCapacityAuthCode.{i}.AuthenticationKey}} as
          the key.

          If both {{param|AuthenticationAlias}} and
          {{param|AuthenticationKeyFileLocation}} are provided, but
          {{param|AuthenticationCode}} is not provided, the client uses
          the {{param|AuthenticationAlias}} as key ID along with
          {{param|AuthenticationKeyFileLocation}} as file location. The
          {{object|IPLayerCapacityAuthCode}} table is ignored.

          If only {{param|AuthenticationAlias}} is provided, and the
          {{object|IPLayerCapacityAuthCode}} does not contain the
          {{param|AuthenticationAlias}}, the client returns an error.

          If only {{param|AuthenticationKeyFileLocation}} is provided, the file
          specified MUST contain a single entry. Otherwise, the client returns
          an error.
        </description>
        <input>
          <component ref="IPLayerCapacityInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost"/>
                <enumeration value="Error_InitConnectionFailed"/>
                <enumeration value="Error_NoResponse"/>
                <enumeration value="Error_PasswordRequestFailed"/>
                <enumeration value="Error_LoginFailed"/>
                <enumeration value="Error_RejectedByRemote"/>
                <enumeration value="Error_IncorrectSize"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPLayerCapacityOutput"/>
        </output>
      </command>

      <command name="ServerSelectionDiagnostics()" async="true" version="2.12">
        <description>
          This command provides access to a diagnostics test that performs
          either an ICMP Ping or UDP Echo ping against multiple hosts
          determining which one has the smallest average response time. There
          MUST be a ping response to the transmitted ping, or timeout, before
          the next ping is sent out.
        </description>
        <input>
          <component ref="IPServerSelectionDiagnosticsInput" version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPServerSelectionDiagnosticsOutput" version="2.12"/>
        </output>
      </command>
    </object>

    <object base="Device.DNS.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">
      <description action="replace">
        The DNS Diagnostics object containing the
        {{command|NSLookupDiagnostics()}} test.
      </description>

      <command name="NSLookupDiagnostics()" async="true" version="2.12">
        <description>
          This command defines access to an IP-layer NS Lookup test for the
          specified IP interface.

          When initiated, the NS Lookup test will contact {{param|DNSServer}}
          and look up {{param|HostName}} {{param|NumberOfRepetitions}} times.

          There will be a {{object|Result}} instance for each time the device
          performs a DNS lookup, which is determined by the value of
          {{param|NumberOfRepetitions}}.

          Any previous {{object|Result}} instances are removed when a new test
          is initiated.
        </description>
        <input>
          <component ref="DNSLookupDiagnosticsInput" version="2.12"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_DNSServerNotResolved">
                  <description>Unable to resolve DNSServer Name</description>
                </enumeration>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="DNSLookupDiagnosticsOutput" version="2.12"/>

          <object base="Result.{i}." minEntries="0" maxEntries="unbounded">

            <parameter base="Status">
              <description action="replace">
                Result Parameter to represent whether the NS Lookup was
                successful or not.
              </description>
            </parameter>
          </object>
        </output>
      </command>
    </object>
    <!-- Commands from common model (converted true parameters) -->

    <object base="Device.Users." access="readOnly" minEntries="1"
        maxEntries="1">
      <command name="CheckCredentialsDiagnostics()" async="false"
          version="2.15">
        <description>
          Checks whether the input {{param|Username}} and {{param|Password}}
          are valid for allowing access to the user interface on the device. If
          not valid, then an indication of why they are not valid is output.
        </description>

        <input>
          <component ref="CheckCredentialsInput"/>
        </input>

        <output>
          <parameter name="Status">
            <description>
              Indicates the response to request to check whether the
              credentials are valid and, if not, why not. {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Credentials_Good"/>
                <enumeration
                    value="Credentials_Bad_Requested_Username_Not_Supported"/>
                <enumeration
                    value="Credentials_Bad_Requested_Password_Incorrect"/>
                <enumeration value="Credentials_Missing"/>
                <enumeration value="Error_Invalid_Input"/>
                <enumeration value="Error_Other" optional="true"/>
              </string>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object base="Device.FAP.GPS." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="GPSReset()" dmr:previousParameter="NumberOfSatellites"
          version="2.12" async="false">
        <description>
          Reset the GPS Hardware.
        </description>
      </command>
    </object>

    <object base="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}."
        access="readOnly" minEntries="0" maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="Status" version="2.12"
          async="false">
        <description>
          Resets the temperature sensor.
        </description>
      </command>
    </object>

    <object base="Device.UserInterface." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="PasswordReset()" async="false"
          dmr:previousParameter="PasswordUserSelectable" version="2.12">
        <description>
          Present only if the Agent provides a password-protected LAN-side user
          interface and supports LAN-side Auto-Configuration.

          Reset {{param|#.LANConfigSecurity.ConfigPassword}} to its factory
          value.
        </description>
      </command>
    </object>

    <object base="Device.UserInterface.HTTPAccess.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded">
      <command name="CreateWebSession()" async="false" version="2.16">
        <description>
          This command creates a time-limited web session. The web session will
          be terminated when the life time of the session exceeds
          {{param|AbsoluteTimeout}} or when no data is transmitted or received
          for {{param|IdleTimeout}}.
        </description>

        <input>
          <parameter name="AbsoluteTimeout" mandatory="false">
            <description>
              {{param}} in {{units}} specifies the amount of time that a
              session is may be active. When ''0'' is specified this feature is
              disabled.
            </description>
            <syntax>
              <unsignedInt>
                <units value="seconds"/>
              </unsignedInt>
            </syntax>
          </parameter>

          <parameter name="IdleTimeout" mandatory="false">
            <description>
              {{param}} in {{units}} specifies the amount of time that a
              session may be idle before it is automatically terminated. When
              ''0'' is specified this feature is disabled.
            </description>
            <syntax>
              <unsignedInt>
                <units value="seconds"/>
              </unsignedInt>
            </syntax>
          </parameter>
        </input>

        <output>
          <parameter name="SessionID" mandatory="true">
            <description>
              Session identifier.
            </description>
            <syntax>
              <string>
                <size maxLength="4096"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Path">
            <description>
              Absolute path component as defined in {{bibref|RFC3986|Section
              3.3}} that can be used to access the session on the web
              interface.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object base="Device.UserInterface.HTTPAccess.{i}.Session.{i}." minEntries="0" maxEntries="unbounded">
      <command name="Delete()" async="false">
        <description>
          This terminates an active session ahead of any configured timeouts.
        </description>
      </command>
    </object>

    <object base="Device.USB.USBHosts.Host.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="Type" version="2.12"
          async="false">
        <description>
          Reset the Host Controller and apply the reset signaling (see
          {{bibref|USB2.0|Chapter 7.1.7.5}}) to all of the Host Controller Hub
          downstream ports.
        </description>
      </command>
    </object>

    <object base="Device.PPP.Interface.{i}." access="readWrite" minEntries="0"
        maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="LowerLayers"
          version="2.12" async="false">
        <description>
          On a reset the device MUST tear down the existing PPP connection
          represented by this object and establish a new one.

          The device MAY delay resetting the connection in order to avoid
          interruption of a user service such as an ongoing voice call.

          Reset on a disabled interface is a no-op (not an error).
        </description>
      </command>
    </object>

    <object base="Device.IP.Interface.{i}." access="readWrite" minEntries="0"
        maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="Router" version="2.12"
          async="false">
        <description>
          On a reset device MUST tear down the existing IP connection
          represented by this object and establish a new one.

          This is the same as disabling and re-enabling the IP interface,
          after which all associated IP addresses and prefixes MUST be refreshed.
          If refreshing is not possible (e.g., due to a significant remaining lifetime of a prefix),
          the implementation may choose to retain them instead of discarding them.

          The device MAY delay resetting the connection in order to avoid
          interruption of a user service such as an ongoing voice call.

          Reset on a disabled interface is a no-op (not an error).
        </description>
      </command>
    </object>

    <component ref="DHCPv4USP"/>
    <component ref="DHCPv6USP"/>

    <object base="Device.IEEE8021x.Supplicant.{i}." access="readWrite"
        minEntries="1" maxEntries="unbounded">

      <command name="Reset()" async="false"
          dmr:previousParameter="AuthenticationSuccessPolicy" version="2.12">
        <description>
          On a reset the device MUST reset the session by performing an initial
          authentication attempt as defined in {{bibref|802.1x-2004|9.6.1.3}},
          Initialize Port by sending out the EAP start message.

          The device MAY delay resetting the resource in order to avoid
          interruption of a user service such as an ongoing voice call.
        </description>
      </command>

      <command name="Disconnect()" version="2.12" async="false">
        <description>
          On a reset the device MUST disconnect (forced unauthentication) the
          resource.

          The device MAY delay re-authentication of the resource in order to
          avoid interruption of a user service such as an ongoing voice call.
        </description>
      </command>
    </object>

    <object base="Device.SmartCardReaders.SmartCardReader.{i}."
        access="readOnly" minEntries="0" maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="Name" version="2.12"
          async="false">
        <description>
          Reset the SmartCard Reader and the associated SmartCard.
        </description>
      </command>
    </object>

    <object base="Device.PeriodicStatistics.SampleSet.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded">

      <parameter name="Status" access="readOnly"
          dmr:previousParameter="Enable" status="deleted">
        <description>
          Indicates availability of Sample statistics. {{enum}}

          The {{enum|Trigger}} value is only used for triggering the Controller
          to fetch the collected data and can only be used when
          {{param|FetchSamples}} is in the range [1:{{param|ReportSamples}}].

          The transition from {{enum|Enabled}} to {{enum|Trigger}} to
          {{enum|Enabled}} MUST be instantaneous and so will result in only a
          single value change for notification purposes.

          {{deprecated|2.16|because the periodic statistics are sent through a
          USP {{event|Push!}} event}}

          {{obsoleted|2.18}}

          {{deleted|2.19}}
        </description>
        <syntax>
          <string>
            <enumeration value="Disabled">
              <description>Collection is disabled.</description>
            </enumeration>
            <enumeration value="Enabled">
              <description>Collection is enabled.</description>
            </enumeration>
            <enumeration value="Trigger">
              <description>
                Collection is enabled and the Controller SHOULD now fetch the
                collected data.
              </description>
            </enumeration>
          </string>
          <default type="object" value="Disabled"/>
        </syntax>
      </parameter>

      <parameter name="Controller" access="readOnly"
          dmr:previousParameter="Name" version="2.15">
        <description>
          {{reference|the {{object|##.LocalAgent.Controller}} instance that
          created {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.

          The USP Controller referenced by this parameter defines the set of
          permissions to use when updating the {{object|Parameter}} table.
          Furthermore, only the USP Controller referenced by this parameter
          will receive a {{event|Push!}} Event (assuming it has an associated
          Subscription), even if another USP Controller has an associated
          Subscription.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="##.LocalAgent.Controller."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="TimeReference" access="readWrite"
          dmr:previousParameter="ReportSamples">
        <description>
          An absolute time reference in UTC to determine when sample intervals
          will complete. Each sample interval MUST complete at this reference
          time plus or minus an integer multiple of {{param|SampleInterval}}.

          {{param}} is used only to set the "phase" of the sample and fetch
          intervals. The actual value of {{param}} can be arbitrarily far into
          the past or future.

          This time reference also determines when the {{event|Push!}} event
          that is controlled by {{param|FetchSamples}} will occur. If
          collection of periodic statistics is enabled and
          {{param|FetchSamples}} is in the range [1:{{param|ReportSamples}}]
          then each such {{event|Push!}} event MUST occur at this reference
          time plus or minus an integer multiple of {{param|FetchSamples}} *
          {{param|SampleInterval}} (the fetch interval).

          If {{param}} is changed while collection of periodic statistics is
          enabled, any stored samples are discarded, and the first sample
          interval begins immediately.

          The Unknown Time value defined in {{bibref|TR-106}} indicates that no
          particular time reference is specified. That is, the CPE MAY locally
          choose the time reference, and is required only to adhere to the
          specified sample and fetch intervals.

          If absolute time is not available to the CPE, its sample and fetch
          interval behavior MUST be the same as if the {{param}} parameter was
          set to the Unknown Time value.

          For example, if {{param|SampleInterval}} is 3600 (an hour) and if
          {{param}} is set to UTC midnight on some day (in the past, present,
          or future) then sample intervals will complete on each UTC hour
          (00:00, 01:00, 02:00 etc).

          If, in addition, {{param|FetchSamples}} is 24, then the fetch
          interval is 86400 (a day) and the {{event|Push!}} event will occur
          every day at UTC midnight.

          Note that, if {{param}} is set to a time other than the Unknown Time,
          the first sample interval (which has to begin immediately) will
          almost certainly be shorter than {{param|SampleInterval}}). This is
          why {{param}} is defined in terms of when sample intervals complete
          rather than start.
        </description>
        <syntax>
          <dateTime/>
          <default type="object" value="0001-01-01T00:00:00Z"/>
        </syntax>
      </parameter>

      <parameter name="FetchSamples" access="readWrite">
        <description>
          The number of sample intervals to be collected before triggering a
          {{event|Push!}} event.

          If this SampleSet is enabled and {{param}} is in the range
          [1:{{param|ReportSamples}}] then a {{event|Push!}} event MUST be sent
          on completion of every {{param}} sample intervals.

          For example, if {{param|ReportSamples}} is 25 and {{param}} is 24,
          then the CPE will store 25 values for each monitored parameter and
          the {{event|Push!}} event will occur as the CPE stores each 24th of
          25 sample intervals.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="1"/>
          </unsignedInt>
          <default type="object" value="1"/>
        </syntax>
      </parameter>

      <event name="Push!" version="2.16">
        <description>
          Periodic Statistics Push event for delivering a periodic statistics
          report within a USP Notification message.
        </description>
        <object name="Parameter.{i}." minEntries="0" maxEntries="unbounded">
          <description>
            Periodic statistics parameter table for the report sent by this
            event. This table contains entries for parameters whose values were
            sampled.
          </description>

          <uniqueKey functional="true">
            <parameter ref="Reference"/>
          </uniqueKey>

          <parameter name="Reference">
            <description>
              {{reference}} This is the parameter being reported by the
              Periodic Statistics mechanism.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
                <pathRef refType="weak" targetType="parameter"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Values">
            <description>
              {{list}} Each entry indicates the value of the referenced
              parameter, as determined by
              {{param|##.Parameter.{i}.SampleMode}}, during the sample
              interval.

              The statistics values in this comma-separated list MUST be in
              time order, with the oldest one first and the most recent one
              last.

              If the {{param|##.Parameter.{i}.SampleMode}} parameter is not
              present, or is inappropriate for the referenced parameter, the
              statistics values MUST be collected in Current mode.
            </description>
            <syntax>
              <list/>
              <string/>
            </syntax>
          </parameter>

          <parameter name="SampleSeconds">
            <description>
              {{list}} Each entry indicates the number of {{units}} during
              which data was collected for this parameter during the sample
              interval.

              Individual {{param}} values can be less than
              {{param|##.SampleInterval}}, for several reasons, including:

              : Any of the reasons for which {{param|##.SampleSeconds}} values
                might be less than {{param|##.SampleInterval}}.

              : The parameter doesn't exist, or was created or deleted during a
                sample interval.
            </description>
            <syntax>
              <list/>
              <unsignedInt>
                <units value="seconds"/>
              </unsignedInt>
            </syntax>
          </parameter>

          <parameter name="SuspectData">
            <description>
              {{list}} Each entry is 0 if the sampled value is believed to be
              valid, or 1 if an event that might affect the validity of the
              sampled value occurred during the sample interval.

              For example, if the parameter value were to be reset during the
              sample interval then it would be appropriate to set {{param}} to
              1.
            </description>
            <syntax>
              <list/>
              <unsignedInt>
                <range maxInclusive="1"/>
              </unsignedInt>
            </syntax>
          </parameter>

          <parameter name="Failures">
            <description>
              Counts the number of times (since this object instance was last
              enabled) that a newly-calculated sample value (accounting for
              {{param|##.Parameter.{i}.SampleMode}}) transitioned from the "in
              range" state to the "out of range" state, or between the "out of
              range (low)" and "out of range (high)" states. The states are
              defined as follows:

              * "in range" : current value is greater than
                {{param|##.Parameter.{i}.LowThreshold}} and less than
                {{param|##.Parameter.{i}.HighThreshold}}.

              * "out of range" : current value is less than or equal to
                {{param|##.Parameter.{i}.LowThreshold}}, or greater than or
                equal to {{param|##.Parameter.{i}.HighThreshold}}.

              * "out of range (low)" : current value is less than or equal to
                {{param|##.Parameter.{i}.LowThreshold}}.

              * "out of range (high)" : current value is greater than or equal
                to {{param|##.Parameter.{i}.HighThreshold}}.

              Note that, if {{param|##.Parameter.{i}.LowThreshold}} and
              {{param|##.Parameter.{i}.HighThreshold}} are both the same, the
              threshold/failure mechanism is disabled, so the value of this
              parameter will not increment.

              This parameter can be incremented at any time during a sample
              interval, and might be incremented more than once during a single
              sample interval. For this reason, the CPE SHOULD place a locally
              specified limit on the frequency at which it will notify the
              Controller of such changes.

              Parameters of non-numeric types cannot support the
              threshold/failure mechanism. The value of this parameter MUST be
              ignored for such parameters.
            </description>
            <syntax>
              <unsignedInt/>
            </syntax>
          </parameter>
        </object>
      </event>

      <command name="ForceSample()" version="2.12" async="false">
        <description>
          Force statistics for the current sample to be calculated and updated
          in the data model.

          If this is the first time that this command is called during the
          current sample interval, this MUST cause a new value to be added to
          each of the periodic statistics comma-separated list parameters, and
          the {{param|ReportEndTime}} and all {{param|SampleSeconds}}
          parameters MUST be updated accordingly.

          If this is not the first time that this command is during the current
          sample interval, then the new values that were added as described in
          the previous paragraph, and the {{param|ReportEndTime}} and all
          {{param|SampleSeconds}} parameters, MUST be updated accordingly.

          Note that {{command}} just provides a "sneak preview" of the current
          sample. It does not create a new sample and it does not interfere
          with the sample interval schedule.

          At the end of each sample interval, if this command was executed
          during the sample interval then the new values that were added as
          described above, and the {{param|ReportEndTime}} and all
          {{param|SampleSeconds}} parameters, will be updated accordingly. In
          other words, the partial sample data that was created when the
          command was executed will be updated one last time at the end of the
          sample interval.
        </description>
      </command>

      <command name="ForceCollection()" version="2.16" async="false">
        <description>
          Start the periodic statistics collection performing actions
          equivalent to a {{command|ForceSample()}} command and transmission
          performing a {{event|Push!}} event immediately, regardless of the
          current values of the {{param|Enable}} and {{param|FetchSamples}}
          parameters.

          This command can be used for testing of the periodic statistics
          collection mechanism and sample set but also to preempt any regular
          schedule without affecting it.
        </description>
      </command>
    </object>

    <object base="Device.MQTT.Client.{i}." access="readWrite" minEntries="0"
        maxEntries="unbounded">

      <command name="ForceReconnect()" dmr:previousParameter="KeepAliveTime"
          version="2.12" async="false">
        <description>
          Disconnects the MQTT client from the MQTT broker and reconnects it
          again (toggle connection). It is only effective if the MQTT client is
          currently connected to the MQTT broker (Parameter {{param|Status|}}
          is {{enum|Connected|Status}}).

          If the MQTT client is in a different state, the command has no
          effect.

          This command may be used to immediately apply changes in the MQTT
          connection settings.
        </description>
      </command>
    </object>

    <object base="Device.MQTT.Broker.{i}.Bridge.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded">

      <command name="ForceReconnect()" dmr:previousParameter="KeepAliveTime"
          version="2.12" async="false">
        <description>
          Disconnects the MQTT bridge to the remote MQTT broker and reconnects
          it again (toggle connection). It is only effective if the MQTT bridge
          is currently connected to the remote MQTT broker (Parameter
          {{param|Status|}} is {{enum|Connected|Status}}).

          If the MQTT bridge is in a different state, the command has no
          effect.

          This command may be used to immediately apply changes in the MQTT
          connection settings.
        </description>
      </command>
    </object>

    <object base="Device.Ethernet.WoL." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="SendMagicPacket()" async="false">
        <description>
          This command sends a magic packet over the CPE active Ethernet
          interfaces.
        </description>
        <input>
          <component ref="SendMagicPacketInput"/>
        </input>
      </command>
    </object>

    <object base="Device.Routing.Babel." access="readOnly" minEntries="1"
        maxEntries="1">
      <command name="StatsReset()" async="false">
        <description>
          This command represents a request to reset all statistics counters to
          zero. Statistics are provided in
          {{object|#.InterfaceSetting.{i}.Stats.}}.
        </description>
      </command>
    </object>
    <object base="Device.Routing.Babel.MACKeySet.{i}.MACKey.{i}."
        access="readWrite" minEntries="0" maxEntries="unbounded">
      <command name="MACTest()" async="false">
        <description>
          This command allows the MAC key and MAC algorithm to be tested to see
          if they produce an expected outcome. The command calculates a MAC for
          {{param|InputString}} using the {{param|#.KeyValue}} and
          {{param|#.MACKeyAlgorithm}} and compares that to the value of
          {{param|InputMAC}}. If the values match, the output {{param|Match}}
          is {{true}}.
        </description>
        <input>
          <parameter name="InputString" mandatory="true">
            <description>
              The command calculates a MAC of {{param}} using the
              {{param|#.KeyValue}} and {{param|#.MACKeyAlgorithm}}.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
          <parameter name="InputMAC" mandatory="true">
            <description>
              The command compares the calculated MAC to {{param}}.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
        </input>
        <output>
          <parameter name="Match">
            <description>
              {{param}} is {{true}} if the calculated MAC and
              {{param|InputMAC}} are the same.
            </description>
            <syntax>
              <boolean/>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object base="Device.IEEE8021x.Supplicant.{i}.Stats." access="readOnly" minEntries="1"
        maxEntries="1">
      <command name="Reset()" async="false" version="2.18">
        <description>
          Reset all this object's statistics counters to zero.
        </description>
      </command>
    </object>

    <object base="Device.SSH.Server.{i}.Session.{i}.">
      <command name="Delete()" async="false">
        <description>
          This command is issued to delete the current active session.
        </description>
      </command>
    </object>

    <object name="Device.CWMPManagementServer." access="readOnly"
        minEntries="1" maxEntries="1" version="2.15">
      <description/>
      <component ref="ManagementServerCommon" version="2.15"/>
    </object>

    <object base="Device.DNS.Relay.Config.{i}." access="readWrite"
      numEntriesParameter="ConfigNumberOfEntries"
      minEntries="0" maxEntries="unbounded">
      <command name="FlushCache()" async="false" version="2.17">
        <description>
          This command empties the cache.
        </description>
      </command>
    </object>

    <!-- override access to writeOnceReadOnly; updated in 2.19 -->
    <object base="Device.Hosts.AccessControl.{i}.">
      <parameter base="Origin" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.DNS.Zone.{i}.">
      <parameter base="Origin" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.DNS.Zone.{i}.Host.{i}.">
      <parameter base="Origin" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.Firewall.Pinhole.{i}.">
      <parameter base="Origin" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.Firewall.DMZ.{i}.">
      <parameter base="Origin" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.Firewall.Set.{i}.">
      <parameter base="Origin" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.NAT.PortMapping.{i}.">
      <parameter base="Origin" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.NAT.PortTrigger.{i}.">
      <parameter base="Origin" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.Routing.Babel.MACKeySet.{i}.MACKey.{i}.">
      <parameter base="KeyValue" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.Routing.Babel.DTLSCertSet.{i}.DTLSCert.{i}.">
      <parameter base="CertValue" access="writeOnceReadOnly"/>
    </object>
    <object base="Device.Routing.Babel.DTLSCertSet.{i}.DTLSCert.{i}.">
      <parameter base="CertPrivateKey" access="writeOnceReadOnly"/>
    </object>

    <!-- override versions for interface components added in 2.18 -->
    <object base="Device.ATM.Link.{i}.Stats.">
      <command base="Reset()" version="2.18"/>
    </object>
    <object base="Device.Ethernet.Interface.{i}.Stats.">
      <command base="Reset()" version="2.18"/>
    </object>
    <object base="Device.Ethernet.Link.{i}.Stats.">
      <command base="Reset()" version="2.18"/>
    </object>
    <object base="Device.Ethernet.LAG.{i}.Stats.">
      <command base="Reset()" version="2.18"/>
    </object>
    <object base="Device.Ethernet.VLANTermination.{i}.Stats.">
      <command base="Reset()" version="2.18"/>
    </object>
    <object base="Device.IP.Interface.{i}.Stats.">
      <command base="Reset()" version="2.18"/>
    </object>
    <object base="Device.Optical.Interface.{i}.Stats.">
      <command base="Reset()" version="2.18"/>
    </object>

    <!-- override versions for interface components added in 2.19 -->
    <object base="Device.DSL.Line.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.DSL.Channel.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.DSL.BondingGroup.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.FAST.Line.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.Cellular.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.DOCSIS.Downstream.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.DOCSIS.Upstream.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.DOCSIS.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.PTM.Link.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.USB.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.HPNA.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.MoCA.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.Ghn.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.HomePlug.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.UPA.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.WiFi.Radio.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.WiFi.SSID.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.ZigBee.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.Bridging.Bridge.{i}.Port.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.PPP.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.GRE.Tunnel.{i}.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.L2TPv3.Tunnel.{i}.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.VXLAN.Tunnel.{i}.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.MAP.Domain.{i}.Interface.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.FWE.Link.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.Logical.Interface.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>
    <object base="Device.XPON.ONU.{i}.EthernetUNI.{i}.Stats.">
      <command base="Reset()" version="2.19"/>
    </object>

    <component ref="STOMP" version="2.12"/>
    <component ref="GatewayInfo"/>


    <!-- Profiles -->
    <component ref="WiFiUSP"/>

    <component ref="IoT_ObjectComponent" path="Device."/>
    <component ref="IoT_NodeComponent" path="Device."/>

    <component ref="MoCAUSP"/>
    <component ref="SoftwareModulesUSP"/>
    <component ref="SyslogUSP"/>
    <component ref="DeviceInfoUSP"/>
    <component ref="ThreadUSP"/>
    <component ref="SecurityUSP"/>

    <!-- General Commands from common model -->

    <profile name="Download:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPv4DownloadDiagnosticsSupported"
            requirement="readOnly"/>
        <parameter ref="IPv6DownloadDiagnosticsSupported"
            requirement="readOnly"/>
        <parameter ref="DownloadTransports" requirement="readOnly"/>
        <command ref="DownloadDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="DownloadURL"/>
            <parameter ref="DSCP"/>
            <parameter ref="EthernetPriority"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ROMTime"/>
            <parameter ref="BOMTime"/>
            <parameter ref="EOMTime"/>
            <parameter ref="TestBytesReceived"/>
            <parameter ref="TotalBytesReceived"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="IPLayerCapacity:1" version="2.14" status="deleted">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPLayerCapacitySupported" requirement="readOnly"/>
        <parameter ref="IPLayerMaxConnections" requirement="readOnly"/>
        <parameter ref="IPLayerMaxIncrementalResult" requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedMetrics" requirement="readOnly"/>
        <command ref="IPLayerCapacity()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Role"/>
            <parameter ref="Host" status="deleted"/>
            <parameter ref="Port" status="deleted"/>
            <parameter ref="JumboFramesPermitted"/>
            <parameter ref="NumberOfConnections" status="deleted"/>
            <parameter ref="EthernetPriority"/>
            <parameter ref="DSCP"/>
            <parameter ref="ProtocolVersion"/>
            <parameter ref="UDPPayloadMin"/>
            <parameter ref="UDPPayloadMax"/>
            <parameter ref="PortMin"/>
            <parameter ref="PortMax"/>
            <parameter ref="TestType"/>
            <parameter ref="PreambleDuration"/>
            <parameter ref="StartSendingRate"/>
            <parameter ref="NumberTestSubIntervals"/>
            <parameter ref="TestSubInterval"/>
            <parameter ref="StatusFeedbackInterval"/>
            <parameter ref="TimeoutNoTraffic" status="deleted"/>
            <parameter ref="Tmax"/>
            <parameter ref="TmaxRTT"/>
            <parameter ref="TimestampResolution"/>
            <parameter ref="LowerThresh"/>
            <parameter ref="UpperThresh"/>
            <parameter ref="HighSpeedDelta"/>
            <parameter ref="SlowAdjThresh"/>
            <parameter ref="HSpeedThresh"/>
          </input>
          <output>
            <parameter ref="BOMTime"/>
            <parameter ref="EOMTime"/>
            <parameter ref="Tmax"/>
            <parameter ref="TestInterval"/>
            <parameter ref="MaxIPLayerCapacity"/>
            <parameter ref="TimeOfMax"/>
            <parameter ref="LossRatioAtMax"/>
            <parameter ref="RTTRangeAtMax"/>
            <parameter ref="PDVRangeAtMax"/>
            <parameter ref="MinOnewayDelayAtMax"/>
            <parameter ref="ReorderedRatioAtMax"/>
            <object ref="IncrementalResult.{i}.">
              <parameter ref="IPLayerCapacity"/>
              <parameter ref="TimeOfSubInterval"/>
              <parameter ref="LossRatio"/>
              <parameter ref="RTTRange"/>
              <parameter ref="PDVRange"/>
              <parameter ref="MinOnewayDelay"/>
              <parameter ref="ReorderedRatio"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="IPLayerCapacityTest:1" version="2.15" status="deleted">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPLayerCapacitySupported" requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedSoftwareVersion"
            requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedControlProtocolVersion"
            requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedMetrics" requirement="readOnly"/>
        <command ref="IPLayerCapacity()">
          <input>
            <parameter ref="Role"/>
            <parameter ref="Host" status="deleted"/>
            <parameter ref="JumboFramesPermitted"/>
            <parameter ref="DSCP"/>
            <parameter ref="TestType"/>
            <parameter ref="IPDVEnable"/>
            <parameter ref="TestSubInterval"/>
            <parameter ref="StatusFeedbackInterval"/>
            <parameter ref="SeqErrThresh"/>
            <parameter ref="ReordDupIgnoreEnable"/>
            <parameter ref="LowerThresh"/>
            <parameter ref="UpperThresh"/>
            <parameter ref="HighSpeedDelta"/>
            <parameter ref="SlowAdjThresh"/>
          </input>
          <output>
            <parameter ref="BOMTime"/>
            <parameter ref="MaxIPLayerCapacity"/>
            <parameter ref="TimeOfMax"/>
            <parameter ref="LossRatioAtMax"/>
            <parameter ref="RTTRangeAtMax"/>
            <parameter ref="PDVRangeAtMax"/>
            <parameter ref="MaxETHCapacityNoFCS"/>
            <parameter ref="MaxETHCapacityWithFCS"/>
            <parameter ref="MaxETHCapacityWithFCSVLAN"/>
            <parameter ref="IPLayerCapacitySummary"/>
            <parameter ref="LossRatioSummary"/>
            <parameter ref="MinRTTSummary"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="IPLayerCapacityTest:2" version="2.17">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPLayerCapacitySupported" requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedSoftwareVersion"
            requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedControlProtocolVersion"
            requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedMetrics" requirement="readOnly"/>
        <command ref="IPLayerCapacity()">
          <input>
            <parameter ref="Role"/>
            <parameter ref="ServerList"/>
            <parameter ref="JumboFramesPermitted"/>
            <parameter ref="DSCP"/>
            <parameter ref="TestType"/>
            <parameter ref="IPDVEnable"/>
            <parameter ref="TestSubInterval"/>
            <parameter ref="StatusFeedbackInterval"/>
            <parameter ref="SeqErrThresh"/>
            <parameter ref="ReordDupIgnoreEnable"/>
            <parameter ref="LowerThresh"/>
            <parameter ref="UpperThresh"/>
            <parameter ref="HighSpeedDelta"/>
            <parameter ref="SlowAdjThresh"/>
          </input>
          <output>
            <parameter ref="BOMTime"/>
            <parameter ref="MaxIPLayerCapacity"/>
            <parameter ref="TimeOfMax"/>
            <parameter ref="LossRatioAtMax"/>
            <parameter ref="RTTRangeAtMax"/>
            <parameter ref="PDVRangeAtMax"/>
            <parameter ref="MaxETHCapacityNoFCS"/>
            <parameter ref="MaxETHCapacityWithFCS"/>
            <parameter ref="MaxETHCapacityWithFCSVLAN"/>
            <parameter ref="IPLayerCapacitySummary"/>
            <parameter ref="LossRatioSummary"/>
            <parameter ref="MinRTTSummary"/>
            <parameter ref="ActiveFlows"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="DownloadTCP:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="DownloadDiagnostics()">
          <output>
            <parameter ref="Status"/>
            <parameter ref="TCPOpenRequestTime"/>
            <parameter ref="TCPOpenResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="Upload:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPv4UploadDiagnosticsSupported" requirement="readOnly"/>
        <parameter ref="IPv6UploadDiagnosticsSupported" requirement="readOnly"/>
        <parameter ref="UploadTransports" requirement="readOnly"/>
        <command ref="UploadDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="UploadURL"/>
            <parameter ref="DSCP"/>
            <parameter ref="EthernetPriority"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ROMTime"/>
            <parameter ref="BOMTime"/>
            <parameter ref="EOMTime"/>
            <parameter ref="TestFileLength"/>
            <parameter ref="TotalBytesSent"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="UploadTCP:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="UploadDiagnostics()">
          <output>
            <parameter ref="Status"/>
            <parameter ref="TCPOpenRequestTime"/>
            <parameter ref="TCPOpenResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="SelfTestDiag:1" version="2.12">
      <object ref="Device." requirement="present">
        <command ref="SelfTestDiagnostics()">
          <output>
            <parameter ref="Status"/>
            <parameter ref="Results"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="NSLookupDiag:1" version="2.12">
      <object ref="Device.DNS.Diagnostics." requirement="present">
        <command ref="NSLookupDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="HostName"/>
            <parameter ref="DNSServer"/>
            <parameter ref="Timeout"/>
            <parameter ref="NumberOfRepetitions"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <object ref="Result.{i}.">
              <parameter ref="Status"/>
              <parameter ref="AnswerType"/>
              <parameter ref="HostNameReturned"/>
              <parameter ref="IPAddresses"/>
              <parameter ref="DNSServerIP"/>
              <parameter ref="ResponseTime"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="Baseline:1" extends="_Baseline:1" version="2.0"
        status="deleted"/>

    <profile name="Baseline:2" base="Baseline:1" extends="_Baseline:2"
        version="2.2" status="deleted"/>

    <profile name="Baseline:3" base="Baseline:2" extends="_Baseline:3"
        version="2.4" status="deleted"/>

    <!-- this is defined from scratch in order to omit Device.LANConfigSecurity -->
    <profile name="Baseline:4" extends="_Baseline:4" version="2.15"/>

    <profile name="IPPingDetailed:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="IPPing()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Host"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="Timeout"/>
            <parameter ref="DataBlockSize"/>
            <parameter ref="DSCP"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <parameter ref="FailureCount"/>
            <parameter ref="AverageResponseTimeDetailed"/>
            <parameter ref="MinimumResponseTimeDetailed"/>
            <parameter ref="MaximumResponseTimeDetailed"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="IPPingDetailed:2" base="IPPingDetailed:1"
        dmr:previousProfile="IPPingDetailed:1" version="2.16">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="IPPing()">
          <input>
            <parameter ref="ProtocolVersion"/>
          </input>
        </command>
      </object>
    </profile>

    <profile name="IPPing:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="IPPing()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Host"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="Timeout"/>
            <parameter ref="DataBlockSize"/>
            <parameter ref="DSCP"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <parameter ref="FailureCount"/>
            <parameter ref="AverageResponseTime"/>
            <parameter ref="MinimumResponseTime"/>
            <parameter ref="MaximumResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="IPPing:2" base="IPPing:1" dmr:previousProfile="IPPing:1"
        version="2.16">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="IPPing()">
          <input>
            <parameter ref="ProtocolVersion"/>
          </input>
        </command>
      </object>
    </profile>

    <profile name="TraceRoute:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="TraceRoute()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Host"/>
            <parameter ref="NumberOfTries"/>
            <parameter ref="Timeout"/>
            <parameter ref="DataBlockSize"/>
            <parameter ref="DSCP"/>
            <parameter ref="MaxHopCount"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ResponseTime"/>
            <object ref="RouteHops.{i}.">
              <parameter ref="Host"/>
              <parameter ref="HostAddress"/>
              <parameter ref="ErrorCode"/>
              <parameter ref="RTTimes"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="TraceRoute:2" base="TraceRoute:1"
        dmr:previousProfile="TraceRoute:1" version="2.16">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="TraceRoute()">
          <input>
            <parameter ref="ProtocolVersion"/>
          </input>
        </command>
      </object>
    </profile>

    <profile name="ATMLoopback:1" version="2.12">
      <object ref="Device.ATM.Diagnostics." requirement="present">
        <command ref="F5Loopback()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="Timeout"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <parameter ref="FailureCount"/>
            <parameter ref="AverageResponseTime"/>
            <parameter ref="MinimumResponseTime"/>
            <parameter ref="MaximumResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="DSLDiagnostics:1" version="2.12">
      <description>
        Note: This profile is valid for G.992.1 modems.
      </description>
      <object ref="Device.DSL.Diagnostics." requirement="present">
        <command ref="ADSLLineTest()">
          <input>
            <parameter ref="Interface"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ACTPSDds"/>
            <parameter ref="ACTPSDus"/>
            <parameter ref="ACTATPds"/>
            <parameter ref="ACTATPus"/>
            <parameter ref="HLINSCds"/>
            <parameter ref="HLINpsds"/>
            <parameter ref="QLNpsds"/>
            <parameter ref="SNRpsds"/>
            <parameter ref="BITSpsds"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="ADSL2Diagnostics:1" version="2.12">
      <description>
        Note: This profile is valid for G.992.3 and G.992.5 modems.
      </description>
      <object ref="Device.DSL.Diagnostics." requirement="present">
        <command ref="ADSLLineTest()">
          <input>
            <parameter ref="Interface"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ACTPSDds"/>
            <parameter ref="ACTPSDus"/>
            <parameter ref="ACTATPds"/>
            <parameter ref="ACTATPus"/>
            <parameter ref="HLINSCds"/>
            <parameter ref="HLINSCus"/>
            <parameter ref="HLINpsds"/>
            <parameter ref="HLINpsus"/>
            <parameter ref="HLOGpsds"/>
            <parameter ref="HLOGpsus"/>
            <parameter ref="HLOGMTds"/>
            <parameter ref="HLOGMTus"/>
            <parameter ref="QLNpsds"/>
            <parameter ref="QLNpsus"/>
            <parameter ref="QLNMTds"/>
            <parameter ref="QLNMTus"/>
            <parameter ref="SNRpsds"/>
            <parameter ref="SNRpsus"/>
            <parameter ref="SNRMTds"/>
            <parameter ref="SNRMTus"/>
            <parameter ref="LATNpbds"/>
            <parameter ref="LATNpbus"/>
            <parameter ref="SATNds"/>
            <parameter ref="SATNus"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="VDSL2Diagnostics:1" version="2.12">
      <description>
        Note: This profile is valid for G.993.2 modems.
      </description>
      <object ref="Device.DSL.Diagnostics." requirement="present">
        <command ref="ADSLLineTest()">
          <input>
            <parameter ref="Interface"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ACTPSDds"/>
            <parameter ref="ACTPSDus"/>
            <parameter ref="ACTATPds"/>
            <parameter ref="ACTATPus"/>
            <parameter ref="HLINSCds"/>
            <parameter ref="HLINSCus"/>
            <parameter ref="HLINGds"/>
            <parameter ref="HLINGus"/>
            <parameter ref="HLINpsds"/>
            <parameter ref="HLINpsus"/>
            <parameter ref="HLOGGds"/>
            <parameter ref="HLOGGus"/>
            <parameter ref="HLOGpsds"/>
            <parameter ref="HLOGpsus"/>
            <parameter ref="HLOGMTds"/>
            <parameter ref="HLOGMTus"/>
            <parameter ref="QLNGds"/>
            <parameter ref="QLNGus"/>
            <parameter ref="QLNpsds"/>
            <parameter ref="QLNpsus"/>
            <parameter ref="QLNMTds"/>
            <parameter ref="QLNMTus"/>
            <parameter ref="SNRGds"/>
            <parameter ref="SNRGus"/>
            <parameter ref="SNRpsds"/>
            <parameter ref="SNRpsus"/>
            <parameter ref="SNRMTds"/>
            <parameter ref="SNRMTus"/>
            <parameter ref="LATNpbds"/>
            <parameter ref="LATNpbus"/>
            <parameter ref="SATNds"/>
            <parameter ref="SATNus"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="SELTDiagnostics:1" version="2.13">
      <object ref="Device.DSL.Diagnostics." requirement="present">
        <command ref="SELTUER()">
          <input>
            <parameter ref="UERMaxMeasurementDuration"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="UER"/>
            <parameter ref="UERScaleFactor"/>
            <parameter ref="UERGroupSize"/>
            <parameter ref="UERVar"/>
          </output>
        </command>
        <command ref="SELTQLN()">
          <input>
            <parameter ref="QLNMaxMeasurementDuration"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="QLN"/>
            <parameter ref="QLNGroupSize"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="HPNADiagnostics:1" version="2.12">
      <object ref="Device.HPNA.Diagnostics." requirement="present">
        <command ref="PHYThroughput()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="NumPacketsInBurst"/>
            <parameter ref="BurstInterval"/>
            <parameter ref="TestPacketPayloadLength"/>
            <parameter ref="PayloadEncoding"/>
            <parameter ref="PayloadDataGen"/>
            <parameter ref="PayloadType"/>
            <parameter ref="PriorityLevel"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <object ref="Result.{i}.">
              <parameter ref="SrcMACAddress"/>
              <parameter ref="DestMACAddress"/>
              <parameter ref="PHYRate"/>
              <parameter ref="BaudRate"/>
              <parameter ref="SNR"/>
              <parameter ref="PacketsReceived"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="UPADiagnostics:1" version="2.12">
      <object ref="Device.UPA.Diagnostics." requirement="present">
        <command ref="InterfaceMeasurement()">
          <input>
            <parameter ref="Type"/>
            <parameter ref="Interface"/>
            <parameter ref="Port"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="Measurements"/>
            <parameter ref="RxGain"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="UDPEchoDiag:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="UDPEchoDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Host"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="EnableIndividualPacketResults"/>
            <parameter ref="Timeout"/>
            <parameter ref="DataBlockSize"/>
            <parameter ref="DSCP"/>
            <parameter ref="InterTransmissionTime"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <parameter ref="FailureCount"/>
            <parameter ref="AverageResponseTime"/>
            <parameter ref="MinimumResponseTime"/>
            <parameter ref="MaximumResponseTime"/>
            <object ref="IndividualPacketResult.{i}.">
              <parameter ref="PacketSuccess"/>
              <parameter ref="PacketSendTime"/>
              <parameter ref="PacketReceiveTime"/>
              <parameter ref="TestGenSN"/>
              <parameter ref="TestRespSN"/>
              <parameter ref="TestRespRcvTimeStamp"/>
              <parameter ref="TestRespReplyTimeStamp"/>
              <parameter ref="TestRespReplyFailureCount"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="UDPEchoDiag:2" base="UDPEchoDiag:1"
        dmr:previousProfile="UDPEchoDiag:1" version="2.16">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="UDPEchoDiagnostics()">
          <input>
            <parameter ref="Port"/>
          </input>
        </command>
      </object>
    </profile>

    <profile name="ServerSelectionDiag:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="ServerSelectionDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="HostList"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="Timeout"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="FastestHost"/>
            <parameter ref="AverageResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="ServerSelectionDiag:2" base="ServerSelectionDiag:1"
        dmr:previousProfile="ServerSelectionDiag:1" version="2.16">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="ServerSelectionDiagnostics()">
          <input>
            <parameter ref="ProtocolVersion"/>
            <parameter ref="Protocol"/>
          </input>
        </command>
      </object>
    </profile>

    <profile name="STOMPConn:1" version="2.12">
      <object ref="Device.STOMP." requirement="present">
        <parameter ref="ConnectionNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.STOMP.Connection.{i}." requirement="createDelete">
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Host" requirement="readWrite"/>
        <parameter ref="Port" requirement="readWrite"/>
        <parameter ref="VirtualHost" requirement="readWrite"/>
        <parameter ref="ServerRetryInitialInterval" requirement="readWrite"/>
        <parameter ref="ServerRetryIntervalMultiplier" requirement="readWrite"/>
        <parameter ref="ServerRetryMaxInterval" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="STOMPHeartbeat:1" extends="STOMPConn:1" version="2.12">
      <object ref="Device.STOMP.Connection.{i}." requirement="createDelete">
        <parameter ref="EnableHeartbeats" requirement="readWrite"/>
        <parameter ref="OutgoingHeartbeat" requirement="readWrite"/>
        <parameter ref="IncomingHeartbeat" requirement="readWrite"/>
      </object>
    </profile>
    <!-- Profiles with command parameter impacts -->

    <profile name="TempStatusAdv:1" extends="TempStatus:1" version="2.0"
        dmr:previousProfile="TempStatus:1">
      <object ref="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}."
          requirement="present">
        <command ref="Reset()"/>
        <parameter ref="LowAlarmValue" requirement="readWrite"/>
        <parameter ref="LowAlarmTime" requirement="readOnly"/>
        <parameter ref="HighAlarmValue" requirement="readWrite"/>
        <parameter ref="HighAlarmTime" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="TempStatusAdv:2" base="TempStatusAdv:1"
        dmr:previousProfile="TempStatusAdv:1" version="2.1">
      <object ref="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}."
          requirement="present">
        <parameter ref="PollingInterval" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="USBHostsAdv:1" extends="USBHostsBasic:1" version="2.0"
        dmr:previousProfile="USBHostsBasic:1">
      <object ref="Device.USB.USBHosts.Host.{i}." requirement="present">
        <command ref="Reset()"/>
        <parameter ref="PowerManagementEnable" requirement="readWrite"/>
      </object>
      <object ref="Device.USB.USBHosts.Host.{i}.Device.{i}."
          requirement="present">
        <parameter ref="IsSuspended" requirement="readOnly"/>
        <parameter ref="IsSelfPowered" requirement="readOnly"/>
        <parameter ref="ConfigurationNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}."
          requirement="present">
        <parameter ref="ConfigurationNumber" requirement="readOnly"/>
        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
      </object>
      <object
          ref="Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.Interface.{i}."
          requirement="present">
        <parameter ref="InterfaceNumber" requirement="readOnly"/>
        <parameter ref="InterfaceClass" requirement="readOnly"/>
        <parameter ref="InterfaceSubClass" requirement="readOnly"/>
        <parameter ref="InterfaceProtocol" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PeriodicStatsAdv:1" extends="PeriodicStatsBase:1"
        version="2.0" dmr:previousProfile="PeriodicStatsBase:1"
        status="deleted">
      <object ref="Device.PeriodicStatistics.SampleSet.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly" status="deleted"/>
        <parameter ref="TimeReference" requirement="readWrite"/>
        <parameter ref="FetchSamples" requirement="readWrite"/>
        <command ref="ForceSample()"/>
      </object>
      <object ref="Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="SampleMode" requirement="readWrite"/>
        <parameter ref="CalculationMode" requirement="readWrite"/>
        <parameter ref="LowThreshold" requirement="readWrite"/>
        <parameter ref="HighThreshold" requirement="readWrite"/>
        <parameter ref="Failures" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PeriodicStatsAdv:2" extends="PeriodicStatsBase:1"
        version="2.16" dmr:previousProfile="PeriodicStatsAdv:1">
      <object ref="Device.PeriodicStatistics.SampleSet.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="TimeReference" requirement="readWrite"/>
        <parameter ref="FetchSamples" requirement="readWrite"/>
        <command ref="ForceSample()"/>
        <event ref="Push!"/>
      </object>
      <object ref="Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="SampleMode" requirement="readWrite"/>
        <parameter ref="CalculationMode" requirement="readWrite"/>
        <parameter ref="LowThreshold" requirement="readWrite"/>
        <parameter ref="HighThreshold" requirement="readWrite"/>
        <parameter ref="Failures" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="IPInterface:1" version="2.0"
        dmr:previousProfile="IPv6Routing:1">
      <object ref="Device.IP." requirement="present">
        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}." requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Name" requirement="readOnly"/>
        <parameter ref="LastChange" requirement="readOnly"/>
        <parameter ref="LowerLayers" requirement="readWrite"/>
        <parameter ref="Type" requirement="readOnly"/>
        <command ref="Reset()"/>
        <parameter ref="IPv4AddressNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}.IPv4Address.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="IPAddress" requirement="readWrite"/>
        <parameter ref="SubnetMask" requirement="readWrite"/>
        <parameter ref="AddressingType" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}.Stats." requirement="present">
        <parameter ref="BytesSent" requirement="readOnly"/>
        <parameter ref="BytesReceived" requirement="readOnly"/>
        <parameter ref="PacketsSent" requirement="readOnly"/>
        <parameter ref="PacketsReceived" requirement="readOnly"/>
        <parameter ref="ErrorsSent" requirement="readOnly"/>
        <parameter ref="ErrorsReceived" requirement="readOnly"/>
        <parameter ref="UnicastPacketsSent" requirement="readOnly"/>
        <parameter ref="UnicastPacketsReceived" requirement="readOnly"/>
        <parameter ref="DiscardPacketsSent" requirement="readOnly"/>
        <parameter ref="DiscardPacketsReceived" requirement="readOnly"/>
        <parameter ref="MulticastPacketsSent" requirement="readOnly"/>
        <parameter ref="MulticastPacketsReceived" requirement="readOnly"/>
        <parameter ref="BroadcastPacketsSent" requirement="readOnly"/>
        <parameter ref="BroadcastPacketsReceived" requirement="readOnly"/>
        <parameter ref="UnknownProtoPacketsReceived" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="IPInterface:2" base="IPInterface:1"
        dmr:previousProfile="IPInterface:1" version="2.2">
      <description>
        This profile is IPv4 specific.
      </description>
      <object ref="Device.IP." requirement="present">
        <parameter ref="IPv4Enable" requirement="readWrite"/>
        <parameter ref="IPv4Status" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}." requirement="createDelete">
        <parameter ref="IPv4Enable" requirement="readWrite"/>
      </object>
      <object ref="Device.IP.Interface.{i}.IPv4Address.{i}."
          requirement="createDelete">
        <parameter ref="Status" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="IPv6Interface:1" dmr:previousProfile="IPInterface:2"
        version="2.2">
      <object ref="Device.IP." requirement="present">
        <parameter ref="IPv6Capable" requirement="readOnly"/>
        <parameter ref="IPv6Enable" requirement="readWrite"/>
        <parameter ref="IPv6Status" requirement="readOnly"/>
        <parameter ref="ULAPrefix" requirement="readWrite"/>
        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}." requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="IPv6Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Name" requirement="readOnly"/>
        <parameter ref="LastChange" requirement="readOnly"/>
        <parameter ref="LowerLayers" requirement="readWrite"/>
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="ULAEnable" requirement="readWrite"/>
        <command ref="Reset()"/>
        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly"/>
        <parameter ref="IPv6PrefixNumberOfEntries" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PPPInterface:1" version="2.0"
        dmr:previousProfile="IPv6Interface:1">
      <object ref="Device.PPP." requirement="present">
        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.PPP.Interface.{i}." requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Name" requirement="readOnly"/>
        <parameter ref="LastChange" requirement="readOnly"/>
        <parameter ref="LowerLayers" requirement="readWrite"/>
        <command ref="Reset()"/>
        <parameter ref="Username" requirement="readWrite"/>
        <parameter ref="Password" requirement="readWrite"/>
        <parameter ref="ConnectionTrigger" requirement="readWrite"/>
      </object>
      <object ref="Device.PPP.Interface.{i}.PPPoE." requirement="present">
        <parameter ref="SessionID" requirement="readOnly"/>
        <parameter ref="ACName" requirement="readWrite"/>
        <parameter ref="ServiceName" requirement="readWrite"/>
      </object>
      <object ref="Device.PPP.Interface.{i}.Stats." requirement="present">
        <parameter ref="BytesSent" requirement="readOnly"/>
        <parameter ref="BytesReceived" requirement="readOnly"/>
        <parameter ref="PacketsSent" requirement="readOnly"/>
        <parameter ref="PacketsReceived" requirement="readOnly"/>
        <parameter ref="ErrorsSent" requirement="readOnly"/>
        <parameter ref="ErrorsReceived" requirement="readOnly"/>
        <parameter ref="UnicastPacketsSent" requirement="readOnly"/>
        <parameter ref="UnicastPacketsReceived" requirement="readOnly"/>
        <parameter ref="DiscardPacketsSent" requirement="readOnly"/>
        <parameter ref="DiscardPacketsReceived" requirement="readOnly"/>
        <parameter ref="MulticastPacketsSent" requirement="readOnly"/>
        <parameter ref="MulticastPacketsReceived" requirement="readOnly"/>
        <parameter ref="BroadcastPacketsSent" requirement="readOnly"/>
        <parameter ref="BroadcastPacketsReceived" requirement="readOnly"/>
        <parameter ref="UnknownProtoPacketsReceived" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PPPInterface:2" base="PPPInterface:1"
        dmr:previousProfile="PPPInterface:1" version="2.2">
      <object ref="Device.PPP." requirement="present">
        <parameter ref="SupportedNCPs" requirement="readOnly"/>
      </object>
      <object ref="Device.PPP.Interface.{i}." requirement="createDelete">
        <parameter ref="IPv6CPEnable" requirement="readWrite">
          <description>
            REQUIRED only for IPv6 capable devices.
          </description>
        </parameter>
      </object>
      <object ref="Device.PPP.Interface.{i}.IPv6CP." requirement="present">
        <description>
          REQUIRED only for IPv6 capable devices.
        </description>
        <parameter ref="LocalInterfaceIdentifier" requirement="readOnly"/>
        <parameter ref="RemoteInterfaceIdentifier" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="MQTTClientExtended:1" base="MQTTClientBase:1"
        dmr:previousProfile="MQTTClientSubscribe:1" version="2.10">
      <description>
        Adds client authentication, will handling and extends statistics
      </description>
      <object ref="Device.MQTT.Client.{i}." requirement="present">
        <parameter ref="Name" requirement="readWrite"/>
        <parameter ref="ClientID" requirement="readWrite"/>
        <parameter ref="Username" requirement="readWrite"/>
        <parameter ref="Password" requirement="readWrite"/>
        <parameter ref="TransportProtocol" requirement="readWrite"/>
        <parameter ref="MessageRetryTime" requirement="readWrite"/>
        <parameter ref="ConnectRetryTime" requirement="readWrite"/>
        <command ref="ForceReconnect()"/>
        <parameter ref="WillEnable" requirement="readWrite"/>
        <parameter ref="WillTopic" requirement="readWrite"/>
        <parameter ref="WillValue" requirement="readWrite"/>
        <parameter ref="WillQoS" requirement="readWrite"/>
        <parameter ref="WillRetain" requirement="readWrite"/>
      </object>
      <object ref="Device.MQTT.Client.{i}.Stats." requirement="present">
        <parameter ref="LastPublishMessageSent" requirement="readOnly"/>
        <parameter ref="LastPublishMessageReceived" requirement="readOnly"/>
        <parameter ref="PublishSent" requirement="readOnly"/>
        <parameter ref="PublishReceived" requirement="readOnly"/>
        <parameter ref="SubscribeSent" requirement="readOnly"/>
        <parameter ref="UnSubscribeSent" requirement="readOnly"/>
        <parameter ref="PublishErrors" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="HPNAQoS:1" version="2.0" dmr:previousProfile="HPNA:1">
      <object ref="Device.HPNA.Interface.{i}.QoS." requirement="present">
        <parameter ref="FlowSpecNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.HPNA.Interface.{i}.QoS.FlowSpec.{i}."
          requirement="createDelete">
        <parameter ref="FlowType" requirement="readWrite"/>
        <parameter ref="Priority" requirement="readWrite"/>
        <parameter ref="Latency" requirement="readWrite"/>
        <parameter ref="Jitter" requirement="readWrite"/>
        <parameter ref="PacketSize" requirement="readWrite"/>
        <parameter ref="MinRate" requirement="readWrite"/>
        <parameter ref="AvgRate" requirement="readWrite"/>
        <parameter ref="MaxRate" requirement="readWrite"/>
        <parameter ref="PER" requirement="readWrite"/>
        <parameter ref="Timeout" requirement="readWrite"/>
      </object>
    </profile>
    <!-- Basic USP profiles -->

    <profile name="DeviceInfo:1" version="2.12">
      <object ref="Device.DeviceInfo." requirement="present">
        <parameter ref="Manufacturer" requirement="readOnly"/>
        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
        <parameter ref="ProductClass" requirement="readOnly"/>
        <parameter ref="SerialNumber" requirement="readOnly"/>
        <parameter ref="ModelName" requirement="readOnly"/>
        <parameter ref="HardwareVersion" requirement="readOnly"/>
        <parameter ref="FriendlyName" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PacketCaptureDiagnostics:1" version="2.13">
      <object ref="Device." requirement="present">
        <command ref="PacketCaptureDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Duration"/>
            <parameter ref="FileTarget"/>
          </input>
          <output>
            <object ref="PacketCaptureResult.{i}.">
              <parameter ref="FileLocation"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="Reboot:1" version="2.12">
      <object ref="Device." requirement="present">
        <command ref="Reboot()"/>
        <event ref="Boot!"/>
      </object>
      <object ref="Device.LocalAgent.Controller.{i}.BootParameter.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="ParameterName" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="Firmware:1" version="2.12">
      <object ref="Device.DeviceInfo." requirement="present">
        <parameter ref="ActiveFirmwareImage" requirement="readOnly"/>
        <parameter ref="BootFirmwareImage" requirement="readWrite"/>
        <parameter ref="FirmwareImageNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.DeviceInfo.FirmwareImage.{i}." requirement="present">
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Name" requirement="readOnly"/>
        <parameter ref="Version" requirement="readOnly"/>
        <parameter ref="Available" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="BootFailureLog" requirement="readOnly"/>
        <command ref="Download()"/>
      </object>
      <object ref="Device.LocalAgent." requirement="present">
        <event ref="TransferComplete!"/>
      </object>
    </profile>

    <profile name="LocalAgent:1" version="2.12">
      <object ref="Device.LocalAgent." requirement="present">
        <parameter ref="EndpointID" requirement="readOnly"/>
        <parameter ref="AdvertisedDeviceSubtypes" requirement="readOnly"/>
        <event ref="Periodic!"/>
        <parameter ref="MTPNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.MTP.{i}." requirement="present">
        <parameter ref="Alias" requirement="readOnly"/>
        <parameter ref="Protocol" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="CoAPAgent:1" extends="LocalAgent:1" version="2.13"
        status="deleted">
      <object ref="Device.LocalAgent.MTP.{i}.CoAP." requirement="present"
          status="deleted">
        <parameter ref="Port" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="STOMPAgent:1" extends="LocalAgent:1" version="2.12">
      <object ref="Device.LocalAgent.MTP.{i}.STOMP." requirement="present">
        <parameter ref="Reference" requirement="readOnly"/>
        <parameter ref="Destination" requirement="readOnly"/>
        <parameter ref="DestinationFromServer" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="WebSocketAgent:1" extends="LocalAgent:1" version="2.13">
      <object ref="Device.LocalAgent.MTP.{i}.WebSocket." requirement="present">
        <parameter ref="Port" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="MQTTAgent:1" extends="LocalAgent:1" version="2.13">
      <description>
        This profile adds USP agent extensions for MQTT transport.
      </description>
      <object ref="Device.LocalAgent.MTP.{i}.MQTT." requirement="present">
        <parameter ref="Reference" requirement="readOnly"/>
        <parameter ref="ResponseTopicConfigured" requirement="readWrite"/>
        <parameter ref="ResponseTopicDiscovered" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="Controllers:1" version="2.12">
      <object ref="Device.LocalAgent." requirement="present">
        <parameter ref="ControllerNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.Controller.{i}." requirement="present">
        <parameter ref="Enable" requirement="readOnly"/>
        <parameter ref="Alias" requirement="readOnly"/>
        <parameter ref="EndpointID" requirement="readOnly"/>
        <parameter ref="AssignedRole" requirement="readOnly"/>
        <parameter ref="PeriodicNotifInterval" requirement="readOnly"/>
        <parameter ref="MTPNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}."
          requirement="present">
        <parameter ref="Enable" requirement="readOnly"/>
        <parameter ref="Alias" requirement="readOnly"/>
        <parameter ref="Protocol" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="CoAPController:1" extends="Controllers:1" version="2.13"
        status="deleted">
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.CoAP."
          requirement="present" status="deleted">
        <parameter ref="Host" requirement="readOnly"/>
        <parameter ref="Port" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="STOMPController:1" extends="Controllers:1" version="2.12">
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.STOMP."
          requirement="present">
        <parameter ref="Reference" requirement="readOnly"/>
        <parameter ref="Destination" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="WebSocketController:1" extends="Controllers:1"
        version="2.13">
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.WebSocket."
          requirement="present">
        <parameter ref="Host" requirement="readOnly"/>
        <parameter ref="Port" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="MQTTController:1" extends="Controllers:1" version="2.13"
        status="deleted">
      <description>
        This profile adds USP controller extensions for MQTT transport.

        {{deprecated|2.16|because it now contains a deprecated parameter}}

        {{obsoleted|2.18}}
      </description>
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.MQTT."
          requirement="present">
        <parameter ref="Reference" requirement="readOnly" status="deleted"/>
        <parameter ref="Topic" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="MQTTController:2" extends="Controllers:1"
        version="2.16">
      <description>
        This profile adds USP controller extensions for MQTT transport.
      </description>
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.MQTT."
          requirement="present">
        <parameter ref="AgentMTPReference" requirement="readOnly"/>
        <parameter ref="Topic" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="Subscriptions:1" version="2.13">
      <object ref="Device.LocalAgent." requirement="present">
        <parameter ref="SubscriptionNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.Subscription.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="ID" requirement="readWrite"/>
        <parameter ref="Recipient" requirement="readOnly"/>
        <parameter ref="CreationDate" requirement="readOnly"/>
        <parameter ref="NotifType" requirement="readWrite"/>
        <parameter ref="ReferenceList" requirement="readWrite"/>
        <parameter ref="Persistent" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="Challenge:1" version="2.12">
      <object ref="Device.LocalAgent.ControllerTrust." requirement="present">
        <command ref="RequestChallenge()"/>
        <command ref="ChallengeResponse()"/>
        <parameter ref="ChallengeNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.ControllerTrust.Challenge.{i}."
          requirement="present">
        <parameter ref="Alias" requirement="readOnly"/>
        <parameter ref="Description" requirement="readOnly"/>
        <parameter ref="Role" requirement="readOnly"/>
        <parameter ref="Value" requirement="readOnly"/>
        <parameter ref="ValueType" requirement="readOnly"/>
        <parameter ref="Instruction" requirement="readOnly"/>
        <parameter ref="InstructionType" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="ControllerTrust:1" version="2.13">
      <object ref="Device.LocalAgent.ControllerTrust." requirement="present">
        <parameter ref="UntrustedRole" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.ControllerTrust.Role.{i}."
          requirement="present">
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Name" requirement="readWrite"/>
        <parameter ref="PermissionNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.ControllerTrust.Role.{i}.Permission.{i}."
          requirement="present">
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Targets" requirement="readOnly"/>
        <parameter ref="Param" requirement="readOnly"/>
        <parameter ref="Obj" requirement="readOnly"/>
        <parameter ref="InstantiatedObj" requirement="readOnly"/>
        <parameter ref="CommandEvent" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="ControllerTrust:2" base="ControllerTrust:1" version="2.16">
      <object ref="Device.LocalAgent.ControllerTrust.Role.{i}.Permission.{i}."
          requirement="present">
        <parameter ref="Order" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="UDSAgent:1" extends="LocalAgent:1" version="2.17">
      <object ref="Device.LocalAgent.MTP.{i}.UDS." requirement="present">
        <parameter ref="UnixDomainSocketRef" requirement="readOnly"/>
      </object>
      <object ref="Device.UnixDomainSockets." requirement="present">
        <parameter ref="UnixDomainSocketNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.UnixDomainSockets.UnixDomainSocket.{i}." requirement="present">
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Mode" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="UDSController:1" extends="Controllers:1" version="2.17">
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.UDS."
          requirement="present">
        <parameter ref="UnixDomainSocketRef" requirement="readOnly"/>
        <parameter ref="USPServiceRef" requirement="readOnly"/>
      </object>
      <object ref="Device.UnixDomainSockets." requirement="present">
        <parameter ref="UnixDomainSocketNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.UnixDomainSockets.UnixDomainSocket.{i}." requirement="present">
        <parameter ref="Alias" requirement="writeOnceReadOnly"/>
        <parameter ref="Mode" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <!-- Can use this for generating a DT (report tool needs some work...) -->

    <profile
        name="USPAgent:1"
        extends="
          DeviceInfo:1
          Reboot:1
          Firmware:1
          LocalAgent:1
          Controllers:1
          Subscriptions:1
          Challenge:1"
        version="2.12"/>
  </model>
</dm:document>
